性能对于数据库应用程序框架的影响
是影响数据库应用程序的最重要的因素,替代方案是因为具有更好的性能
驱动工作环境反应了驱动的性能
服务器维护JDBC的连接池,池化对象占用的内存和池化将触发额外GC数量之间取得平衡。
实际链接的对象可能不是很大,但是语句缓存(基于每个链接而存在)可能很大。
如果数据库是瓶颈,向忙碌的系统施加负载只会降低性能
改善方法:
用连接池的限制发送最小规模的数据库的工作量。
应用程序线程可能需要等待一个空闲链接,但如果数据库没有压到,系统总吞吐量会最大化。
PreparedStatement预处理调用允许数据库重用正在执行SQL信息
为后续数据库执行语句节省了工作
预处理语句还具有安全性和编程的优势,特别是调用指定参数方面
PrepareStatement预编译重用:
第一次执行SQL语句,将SQL发送给数据库服务器进行解析,编译和优化,然后将结果缓存起来便于后面执行。
应用程序对正确性要求最终决定了事务的处理方式。
数据库事务有两方面的性能损失:
如何对事务编程和如何在事务中持有数据库锁的问题思考
JDBC事务控制
事务的开始和结束都基于Connection对象的使用方式
用法:链接一个自动提交模式(setAutoCommit)不需要自动提交,如果自动提交会有性能影响,如果关闭自动提交,链接一个对象上的第一次调用会默认创建一个隐式的事务,这个事务持续到显示执行提交或者回滚方法。使用该链接的下一个数据库调用会开启一个新的事务。
基于事务提交成本高的原因平衡一下事务执行的工作和事务锁的设计之间的平衡。
批处理对于数据库调用和事务的平衡。
事务隔离和锁
数据库的可扩展性——因为数据在事务中被锁定,锁可以保证数据的完整性-让事务处理隔离态。
1.TRANSACTION_SERIALIZABLE 可串行化
在事务执行期间,事务访问的所有数据都被锁定,序列化事务每次查询是看到的数据都是一样。防止脏读,幻读,不可重复读
2.TRANSACTION_REPEATABLE_READ 幻读
事务运行期间,被访问数据都锁定,其他事务可在任何时候写入数据到表,
导致幻读的原因是执行查询语句之后另一个事务写入数据后再次查询发现数据变了。
4.TRANSACTION_READ_UNCOMMITTED 脏读
无锁,一个事务可以读取在另一事务中未提交的数据,可造成脏读是因为其他事务可能并没有实际发生写操作而导致获取错误的数据。
setFetchSize方法设置驱动一次加载数据行数——平衡JDBC内部缓冲区和应用程序的使用