对于启用了连接轮询的Web应用程序,最好使用本地范围的连接对象或实例范围的连接对象。我知道两者之间可能没有很大的性能提升(因为汇集),但是你会说一个比另一个更好的模式。谢谢;)
public class MyServlet extends HttpServlet {
DataSource ds;
public void init() throws ServletException {
ds = (DataSource) getServletContext().getAttribute("DBCPool");
}
protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
SomeWork("SELECT * FROM A");
SomeWork("SELECT * FROM B");
}
void SomeWork(String sql) {
Connection conn = null;
try {
conn = ds.getConnection();
// execute some sql
.....
} finally {
if(conn != null) {
conn.close(); // return to pool
}
}
}
}
或者
public class MyServlet extends HttpServlet {
DataSource ds;
Connection conn;*
public void init() throws ServletException {
ds = (DataSource) getServletContext().getAttribute("DBCPool");
}
protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
try {
conn = ds.getConnection();
SomeWork("SELECT * FROM A");
SomeWork("SELECT * FROM B");
} finally {
if(conn != null) {
conn.close(); // return to pool
}
}
}
void SomeWork(String sql) {
// execute some sql
.....
}
}
答案 0 :(得分:1)
你应该采用这种方法:
您的第一种方法并不是一个好主意,因为如果其中一个工作单元失败,您可能会使数据库处于不一致的状态。
也许您将完成第一个工作单元,然后无法进行第二个池连接(其他一些线程首先进入)。也许在负载很重的情况下,这将发生在多个请求中,没有任何事情可以正常完成。