1.负面影响资料库插件操控性最关键的不利因素
1.1. JDBC驱动力
1.1.1. JPA下层采用了JDBC
2.瘦驱动力
2.1.为的是让Java插件的缓存挤占极小
2.2.倚赖资料库伺服器来顺利完成更多的处置组织工作
3.胖驱动力
3.1.组织工作从资料库移往Java插件
3.2.展开更多处置、耗用更多缓存
4. JDBC相连池
4.1.准则1:让插件中的每一缓存都有两个相连
4.1.1.在伺服器中,在如上所述时将缓存池和相连池设置为完全相同的大小不一4.1.2.在分立插件中,能依照插件建立的缓存数确认相连池的大小不一4.1.3.流程中的任何人缓存都无须等候需用的资料库相连,因此资料库有足够多的天然资源来处置插件施予的阻抗
4.2.数据库是困局,准则1就不适用于了
4.2.1.用相连池管制发送至较大型资料库的组织工作效率4.2.1.1.插件缓存可能将须要等候两个空余的相连4.2.1.2.假如资料库没被拖垮,控制系统的总客运量会最小化
4.3.调用相连第一类的生产成本极高
4.3.1.在Java中它时常被韦格尔4.3.2.在韦格尔第一类所挤占的缓存和韦格尔将促发的附加GC数目间获得适度的均衡是十分关键的
4.4.优化相连池很关键
4.4.1.减少对垃圾回收器产生不利负面影响4.4.2.减少对资料库的操控性产生不利负面影响
5.驱动力类型
5.1.1型驱动力
5.1.1. ODBC和JDBC间的桥梁5.1.1.1. Open Database Connectivity,开放资料库互连5.1.2.两个流程必须采用ODBC与资料库展开通信,就必须采用5.1.3.操控性一般很差
5.2.3型驱动力
5.2.1.纯Java语言编写5.2.2.为特定的架构设计5.2.3.有个中间件能提供中间转换过程5.2.4.中间件能位于DMZ中,为资料库相连提供附加的安全保障
5.3.2型驱动力
5.3.1.采用原生库来访问资料库5.3.2.允许Java驱动力利用多年来在编写C库上所做的组织工作5.3.3.资料库供应商必须为驱动力提供与平台相关的原生库,Java流程也必须增设环境变量才能采用该库5.3.4.操控性往往十分好
5.4.4型驱动力
5.4.1.纯Java驱动力5.4.2.实现了资料库供应商为访问数据库定义的线路协议5.4.3.操控性通常和2型驱动力一样好5.4.4.最容易采用
5.5.推荐采用
6.预处置语句
6.1.不是Statement展开JDBC调用
6.1.1.语句只采用一次6.1.1.1.最好采用Statement常规语句
6.2.采用PreparedStatement场景
6.2.1.重用6.2.2.包含很多JDBC调用的批处置流程6.2.3.在其生命周期中会服务大量请求的伺服器
6.3.具有安全性和编程的优势
6.4.会耗用大量的堆空间
6.4.1.避免因韦格尔太多十分大的第一类而产生GC问题
7.预处置语句被韦格尔
7.1.重用PreparedStatement第一类关键点
7.1.1. JDBC相连池7.1.2. JDBC驱动力配置
7.2.必须在每一相连的基础上展开韦格尔
7.2.1.大多数JDBC驱动力和数据框架能自动地做到这一点7.2.2.确保JDBC驱动力和数据框架只有两个在管理预处置语句池是十分关键的7.2.3.预期JDBC驱动力能够更好地韦格尔语句7.2.3.1.驱动力是针对特定资料库的7.2.3.2.比更通用的插件伺服器代码更好
7.3.相连池的大小不一很关键
7.3.1.会缓存预处置语句7.3.1.1.语句缓存7.3.1.2.会耗用大量的堆空间
7.4.管理语句池
7.4.1. ConnectionPoolDataSource类的setMaxStatements()方法能启用或禁用语句池7.4.1.1. setMaxStatements()方法的值为0,语句池就会被禁用7.4.2.配置JDBC驱动力来建立和管理语句池7.4.2.1.查阅该驱动力的文档7.4.2.2.增设驱动力,将maxStatements属性设定为所需的值(语句池的大小不一)7.4.2.3.附加的增设7.4.3.在插件代码中建立和管理语句池
8.事务
8.1.插件对正确性的要求最终决定了事务的处置方式
8.1.1.不要让对操控性的渴望超过插件的正确性
8.2.操控性损失
8.2.1.资料库事务的建立和提交须要时间8.2.1.1.确保资料库的更改完全存储到磁盘上8.2.1.2.要确保资料库事务日志是一致的8.2.2.事务通常会获得一组特定数据的锁
8.3.事务的开始和结束都基于Connection第一类的采用方式
8.3.1.通过setAutoCommit()方法增设相连有两个自动提交模式
8.4.事务提交生产成本极高
8.4.1.两个目标是在两个事务中执行尽可能将多的组织工作8.4.2.另两个目标执行时间应该尽可能将短8.4.3.矛盾
8.5.锁能保护数据的完整性
8.6.事务隔离模式
8.6.1. TRANSACTIONSERIALIZABLE8.6.1.1.序列化事务8.6.1.2.生产成本最高8.6.1.3.在事务展开期间,事务访问的所有数据都被锁定8.6.1.4.适用于于通过主键访问的数据和通过WHERE子句访问的数据8.6.1.5.在采用WHERE子句的时候,表会被锁定,这样在事务展开期间就不能添加满足该子句的新数据8.6.1.6.每次查询时看到的数据就都是一样的8.6.2. TRANSACTIONREPEATABLEREAD8.6.2.1.重复读8.6.2.2.在事务展开期间,被访问的所有数据都被锁定8.6.2.3.其他事务能在任何人时候向表中插入新的数据8.6.2.4.幻读(phantom read)8.6.2.5. MySQL默认8.6.2.6. Oracle不支持8.6.3. TRANSACTIONREADCOMMITTED8.6.3.1.不可重复读8.6.3.2.锁定事务展开期间被写入的数据8.6.3.3.在事务展开期间,某一时刻读取的数据可能将和另一时刻读取的数据不同8.6.3.4. Oracle默认8.6.3.5. IBM Db2默认8.6.4. TRANSACTIONREADUNCOMMITTED8.6.4.1.生产成本最低8.6.4.2.脏读(dirty read)8.6.4.3. Oracle不支持8.6.5. TRANSACTIONNONE8.6.5.1. JDBC规范定义了第5种事务隔离模式8.6.6. setTransactionIsolation()方法8.6.6.1.给资料库提供必要的事务隔离级别8.6.6.2.假如资料库不支持给定的级别8.6.7.悲观锁(pessimistic locking)8.6.8.乐观锁(optimistic locking)8.6.8.1.数据访问不存在竞争,采用乐观锁会显著提升操控性8.6.8.2.当两个数据源间发生竞争的概率极小时,乐观锁的效果最好
8.7.结果集
8.7.1.增设JDBC驱动力一次传输的数据行数8.7.1.1.能采用PreparedStatement第一类上的setFetchSize()方法8.7.1.2.默认值因JDBC驱动力的不同而不同8.7.2.处置大量查询数据的插件时应该考虑更改数据的提取大小不一8.7.3.权衡8.7.3.1.在插件中加载太多数据(给垃圾回收器增加压力)8.7.3.2.为的是检索一组数据而频繁调用资料库