我正在使用相当标准的 Web/服务/数据访问分层设计构建一个用于娱乐/学习的小型网站。
对于数据访问层,处理创建连接对象以调用我的 SQL 存储过程的最佳方法是什么?为什么?请记住,我正在手动编写很多代码(我知道我可以使用 Hibernate 等为我做很多这样的事情)......
1) 我应该创建一个 Connection 的静态实例并通过它运行我的所有查询还是会导致并发问题?
2)我应该为每个数据库调用创建一个连接实例并接受性能开销吗?(如果是这种情况,我将在以后研究连接池)
您应该Connection
每个线程使用一个。不要跨线程共享连接。
考虑使用Apache DBCP。这是配置数据库连接并从池中提取它们的免费且标准的方法。这是 Tomcat 等高性能 Web 服务器使用的方法。
此外,如果您使用 DBCP,由于它是一个池(读取:缓存),因此频繁创建/关闭连接几乎不会受到影响。
标准方法是设置数据源。所有应用程序服务器都可以通过它们的管理控制台执行此操作。然后可以通过它的 JNDI 名称(例如“jdbc/MyDB”)访问该池。
事实上,数据源应该是一个连接池(通常是)。它缓存连接,在传递给应用程序之前对其进行测试,并执行许多其他重要功能。
在您的代码中,您:
您可以自己设置池(使用任何免费提供的池实现),但如果您使用的是应用程序服务器,这真的没有任何意义。
PS 由于它是一个 Web 应用程序,因此在请求后确保您已关闭连接的好方法是使用 HttpFilter。您可以在 web.xml 中设置一个。当请求到来时,获取连接,放入ThreadLocal。在请求期间,从 ThreadLocal 获取连接,但永远不要关闭它。请求后,在过滤器中,关闭连接。