Java的那些事儿
Java于我,是一门很实用的语言。在大学里,起码在我们那时的大学,Java可不是一门登堂入室的语言,那是汇编语言,C语言,甚至Pascal语言的天下。不过Java却是学生时代兼职的第一语言(嘿嘿,真实用)。这对大学的语言教学真有那么一点讽刺意味。
当然,我觉得相比C/C++,Java做为后起之秀,吸取着以前语言的经验教训,而又没有类似C++必须兼容C的沉重负担,一切从新设计,这使它变成了一门简单而又强大的语言。还有,Java有着丰富的入门教程,新手很容易通过例子掌握一个具体的知识点。Java的IDE应该是做得比较出色的,如JBuilder,JDeveloper,Eclipse。
而正式工作后,在实际项目中使用C/C++的机会其实也很少,这是一个开发效率的问题,虽说C/C++的运行效率比Java更高,但现在人们更关注的,却是开发效率,还有应用总体的高性能与高可扩展性问题。对于开发并发应用,Java提供了内置的支持,而C/C++,线程安全,并发技术,对于一般的入门者那应该是很高阶的话题吧。
当然,Java的易于上手,并不表明新手们就能把它用得很好。例如,对于与数据库打交道,没有对数据库的基础知识那也是不行的,对于Java来说,很大一部分就在于如何使用JDBC开发出高性能的数据库Java应用程序。这里当然可以推而广之,对于其它的编程语言,这一问题也广泛存在,如如何使用OCI开发高性能的数据库C应用程序,Pro*C应用程序,PHP应用程序。
对于Oracle数据库而言,起码有以下几点是Java程序员所应该掌握的:
第一是连接池技术,数据库默认就提供了对高并发的支持。应用程序有两种极端,一种是全局只使用一个连接,这很幼稚,但这确实存在;另一种是只要需要操作数据库,就创建一个新的连接,从而会出现同一时刻,并发数据库连接数成千上万的情形。解决以上两种问题的方法就是使用连接池技术,并设置一个合理的连接数的最大值,这取决于数据库服务器的CPU个数,最佳的连接数一般应该在CPU个数的2到4倍左右。
UCP是Oracle提供的连接池驱动,以ucp.jar的形式提供。一个简单的示例如下:
PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource(); pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource"); pds.setURL("jdbc:oracle:thin:@//localhost:1521/orcl"); pds.setUser("scott"); pds.setPassword("tiger"); pds.setInitialPoolSize(20); pds.setMinPoolSize(20); pds.setMaxPoolSize(20); Connection conn = pds.getConnection();
如果不用连接池,就不需要上面的ucp.jar,只需要一般的驱动,如ojdbc5.jar。
OracleDataSource ds = new OracleDataSource(); ds.setURL("jdbc:oracle:oci:@//localhost:1521/orcl"); ds.setUser("scott"); ds.setPassword("tiger"); Connection conn = pds.getConnection();
第二是语句池技术,解析SQL语句并生成执行计划,对于数据库引擎来说是很昂贵的操作。因此,在SQL语句中必须使用绑定变量而不是文本常量。另一方面,即使通过绑定变量避免了重新生成执行计划,但如果还存在软解析也会给系统带来额外的CPU消耗。如下面的语句:
while(true){ OraclePreparedStatement stmt = (OraclePreparedStatement) conn.prepareStatement("select ename from emp where empno = ?"); stmt.setString(1, "xxx"); OracleResultSet rs = (OracleResultSet) a_stmt.executeQuery(); while (rs.next()) { System.out.println(rs.getString(1)); } }
每执行一次conn.prepareStatement都会导致数据库里的一次软解析。解决方法有三种:
1. 把这个conn.prepareStatement移动while循环的外面。
2. 对于直接从DataSource获取的连接,启用连接的语句缓冲。
conn.setImplicitCachingEnabled(true); conn.setStatementCacheSize(10);
3. 而对于UCP连接池,则可以通过设置连接池的属性启用语句的缓冲。
pds.setMaxStatements(10);
第三是各种泄露问题,连接泄露,语句游标泄露,锁泄露。Java语言只会帮助回收应用程序里的内存结构,却不会帮助你关闭曾经打开的数据库连接、游标,以及对事务的提交或回滚。下图是一个演示锁泄露的例子,粉红色区域面积越来越大,代表等待事件enq: TX - row lock contention越来越严重。一个常见的原因就是异常处理的代码中忘了对事务进行commit或者rolloback。
建议继续学习:
- Java技术路线 (阅读:6870)
- Java应用运维 (阅读:3755)
- Java陷阱(2010版) (阅读:3242)
- Java将Object对象转换为String的总结合集 (阅读:2941)
- Java 常量值修改后不起作用 (阅读:2799)
- Eclipse Xtend对Java说:我帮你瘦身 (阅读:2636)
- Java泛型简明教程 (阅读:2633)
- 五四陈透过PHP看JAVA系列:strtotime (阅读:2269)
- 你应该更新的Java知识之Optional (阅读:2168)
- 通过JNI实现Java对C/C++的调用 (阅读:1984)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:Kaya 来源: OS与Oracle
- 标签: Java
- 发布时间:2013-05-29 22:17:54
- [41] android 开发入门
- [39] Oracle MTS模式下 进程地址与会话信
- [38] IOS安全–浅谈关于IOS加固的几种方法
- [35] 图书馆的世界纪录
- [35] Go Reflect 性能
- [34] 读书笔记-壹百度:百度十年千倍的29条法则
- [34] 如何拿下简短的域名
- [32] 【社会化设计】自我(self)部分――欢迎区
- [29] 视觉调整-设计师 vs. 逻辑
- [28] 程序员技术练级攻略