传递jdbc数据源v / s传递Connection对象 - 从servlet到java类

时间:2012-01-21 23:06:22

标签: mysql java-ee servlets jdbc connection-pooling

我有一个处理发布/获取请求的主Servlet 我正在使用连接池(jdbc / mysql与glassfish v3),我的servlet代码是:

public class Controller extends HttpServlet {
private DataSource datasource;
@Override
public void init() throws ServletException {
      super.init();
     try {
        //Database Connection pooling:
        InitialContext ctx = new InitialContext();
        datasource = (DataSource)ctx.lookup("jdbc/MySQLPool");
      }
      catch (Exception e) {
         e.printStackTrace();
       }
   }
private Connection getConnection() throws SQLException {
    return datasource.getConnection();
    }
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    Connection connection=null;
    try {
            connection = datasource.getConnection();
            Object obj=  cmdFactory.getInstance().getCommand(Cmd).execute(connection);
        }

等... 并在最后一个块中的servlet末尾关闭连接

所以现在我将“connection”对象作为最后一行中的参数传递,供其他(非servlet)java类通过应用程序的较低层使用。这是错的吗?最好是传递数据源对象(然后在特定的类中执行datasource.getConnection())?或者是否有类似于“getServletContext()。getAttr(database)”的东西可以在其他java类中用来获得这个连接?

1 个答案:

答案 0 :(得分:3)

DataSource允许获取JDBC连接(大多数时候来自连接池)。在servlet环境中,如果您要求连接到DataSource两次,您将获得两个不同的连接。

因此传递DataSource没有意义:您希望调用链中的所有对象使用相同的连接,并在最后提交。

连接必须通过从DataSource获取它的方法关闭,在finally块中,否则池将泄漏连接,并且您将很快耗尽可用连接。