一个简单的问题:在Java / JDBC中访问数据库的更有效方法是什么?
我是一个Web开发人员,我想编写一些可重用且可扩展的代码。
对我来说有趣的是使用ResultSupport之类的工具:它在资源使用方面是否过于庞大?
你能建议什么?
答案 0 :(得分:5)
不仅仅是JDBC特定的,只是一般的SQL内容
如果必须多次重新运行查询,请使用PreparedStatement。使用存储过程(如果可用)。这显然不便于YMMV。
如果您不使用ResultSet或Statement,请务必关闭它。关闭Statement将自动关闭与Statement关联的所有ResultSet。关闭ResultSet仍然是一个好习惯。
尝试限制可查询的内容,例如:从XXX和yyy之间的order_date订单中选择*。在MySQL中,查询可以是全表扫描或“范围”,具体取决于返回的数据量。因此,决定您希望查询的“灵活性”
如果您使用的是MySQL,请使用explain来优化您的查询。如果您使用的是JPA,那么您无法看到生成的SQL。 (这不是严格的JDBC)您可能希望在ORM管理器上启用日志记录以显示所使用的SQL语句。然后使用explain来优化它。如果ORM生成真正复杂的查询,您可能想要使用@NamedNativeQuery
如果您的JDBC驱动程序支持批量更新,请使用它。 PreparedStatement和ResultSet支持批量更新。
您还可以控制提交。如果您正在执行大量更新,请将其关闭。自己调用commit()。
答案 1 :(得分:1)
这个简单问题的最佳答案是:“这取决于”。
您可以使用许多API进行数据库访问。几乎所有这些都将使用JDBC API作为与数据库通信的手段。所以从理论上讲,没有任何东西可以击败原始的低级JDBC(就像理论上机器代码总是比高级编程语言更快)。
但是,由于您还想编写可重用的代码,我建议您查看JPA。对于关系数据库的对象持久性,它是 Java标准。它的性能非常好,而且非常便携。
答案 2 :(得分:0)
使用始终连接池DataSource(例如c3p0)非常重要。
答案 3 :(得分:0)
有一个项目将java对象映射到mysql数据库。 Azirt.
答案 4 :(得分:0)
使用连接池(来自容器或连接池,如c3p0或DBCP)和类似DBUtils或Spring的JdbcTemplate。
答案 5 :(得分:-1)
我认为最简单也是最常见的方法是使用Spring及其JDBCTemplate。
最佳方法可能取决于您用于创建Web应用程序的堆栈。如果你重新开始,那么Spring是一个很好的方式。