使用三层架构实现业务处理

JNDI

JNDI的了解

JNDI全称:Java Naming and Directory Interface,Java命名和目录接口。

JNDI:是一个有关应用序设计的 API 为开发人员提供了查找和访问各种命名和目录服务的通用、 统一的接口;

作用:通过名称将资源与服务进行关联。

JNDI的优点和作用
  • 在应用与Java对象或资源之间建立松耦合的逻辑关联,简化应用对于资源的配置及维护工作;

  • 可以在更大范围、不同应用之间共享资源;

使用JNDI的步骤
  1. 配置资源;

  2. 通过 Context 的 lookup()方法查找资源

连接池

统数据库连接技术
  • 需要经常与数据库建立连接,在访问结束后必须关闭连接释放资源;

  • 当并发访问数量较大时,执行速度受到极大影响;

  • 系统的安全性和稳定性相对较差;

数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。

数据库连接池:数据库连接池负责分配、管理和释放数据库连接;

  • 它允许应用程序重复使用一个现有的数据连接,而不再是重新建立一个;

  • 释放那些空闲时间超过最大空闲时间的数据库连接,以避免由于有释放数据库连接而引起的数据库连接泄露;

  • 明显提高数据库的操作性能

数据库连接技术存在的问题
  • 重复创建、销毁数据库连接
  • 并发访问数量较大时,执行速度受到极大影响
  • 系统的安全性和稳定性较差
数据库连接池技术带来的优势
  • 资源重用
  • 更快的系统响应速度
  • 据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。
  • 统一的连接管理,避免数据库连接泄漏
使用连接池

使用连接池技术管理数据库链接

  • 每次请求从连接池中获取数据库连接
  • 处理结束后,将数据库连接归还到连接池

三层架构

了解

是一种常见的一种架构模式,分层模式是将解决方案的组件分隔到不同的层中,每一层的组件应保持内聚性,每一层都应该与其下的每层保持松耦合。

三层架构中的三层指的是表示层、业务逻辑层、数据访问层;

表示层

数据展示

数据收集

用户交互

业务逻辑层

封装业务处理逻辑

事务管理

数据访问层

连接数据库

数据处理

层与层之间的关系

在三层架构中各层之间相互依赖。表示层依赖于业务逻辑层,业务逻辑层依赖于数据访层 ,各层之间的数据传递方向分为请求与晌应两个方向。

分层的目的和原则
分层目的

高内聚:每一层的组件具有内聚性

低耦合:有依赖关系的各层之间保持低耦合

分层原则

上一层依赖其下一层、依赖关系不跨层

表示层不能直接访问数据访问层

上层调用下层的结果,取决于下层的实现

下一层不能调用上一层

下一层不依赖上一层

上层的改变不会影响下一层

下层的改变会影响上一层得到的结果

在上一层中不能出现下一层的内容

分工明确,各司其职

分层的特点:

上一层不知道下一层的存在

每一层就知道紧邻下一层的存在,而不知道另外下一层的存在

上一层使用下一层提供的服务,并为下一层提供数据

分层的优势:

1、职责划分明确,开发人员可以只关注整个结构中的其中某一层;

2、可以很容易的用新的实现来替换原有层次的实现;

3、可以降低层与层之间的依赖;

4、有利于标准化;

5、利于各层逻辑的复用。

6、结构更加的明确

7、在后期维护的时候,极大地降低了维护成本和维护时间

分层的劣势:

1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。

2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。

3、增加了开发成本。

JDBC

使用PrearedStatement,可以通过预编译的方式避免在拼接SQL时造成SQL注入。
使用ConnectionPool
禁用自动提交这个最佳实践在我们使用JDBC的批量提交的时候显得非常有用,将自动提交禁用后,你可以将一组数据库操作放在一个事务中,而自动提交模式每次执行SQL语句都将执行自己的事务,并且在执行结束提交。
使用Batch Update:批量更新/删除,比单个更新/删除,能显著减少数据传输的往返次数,提高性能。
使用列名获取ResultSet中的数据,从而避免invalidColumIndexErrorJDBC中的查询结果封装在ResultSet中,我们可以通过列名和列序号两种方式获取查询的数据,当我们传入的列序号不正确的时候,就会抛出invalidColumIndexException,例如你传入了0,就会出错,因为ResultSet中的列序号是从1开始的。另外,如果你更改了数据表中列的顺序,你也不必更改JDBC代码,保持了程序的健壮性。有一些Java程序员可能会说通过序号访问列要比列名访问快一些,确实是这样,但是为了程序的健壮性、可读性,我还是更推荐你使用列名来访问。
使用变量绑定而不是字符串拼接使用PreparedStatment可以防止注入,而使用?或者其他占位符也会提升性能,因为这样数据库就可以使用不同的参数执行相同的查询,提示性能,也防止SQL注入。
关闭Connection 等资源,确保资源被释放;
选择合适的JDBC驱动,参考前文,选择第四种;
尽量使用标准的SQL语句,从而在某种程度上避免数据库对SQL支持的差异不同的数据库厂商的数据库产品支持的SQL的语法会有一定的出入,为了方便移植,推荐使用标准的ANSI SQL标准写SQL语句。
使用正确的getXXX()方法,当从ResultSet中读取数据的时候,虽然JDBC允许你使用getString()和getObject()方法获取任何数据类型,推荐使用正确的getter方法,这样可以避免数据类型转换。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值