JNDI
JNDI的了解
JNDI全称:Java Naming and Directory Interface,Java命名和目录接口。
JNDI:是一个有关应用序设计的 API 为开发人员提供了查找和访问各种命名和目录服务的通用、 统一的接口;
作用:通过名称将资源与服务进行关联。
JNDI的优点和作用
-
在应用与Java对象或资源之间建立松耦合的逻辑关联,简化应用对于资源的配置及维护工作;
-
可以在更大范围、不同应用之间共享资源;
使用JNDI的步骤
-
配置资源;
-
通过 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方法,这样可以避免数据类型转换。