用Java调用存储过程

时间:2013-10-06 00:15:09

标签: java postgresql stored-procedures jdbc connection-pooling

我正在为PostgreSQL使用JDBC驱动程序,我想调用存储过程。

假设我有一个调用存储过程的方法如下:

public void callProcedure(int someValue)    {

    Connection con = null;
    try {
        con = connectionPool.getConnection();

        CallableStatement st = con.prepareCall("{ call some_procedure(?) }");
        st.setInt(1, someValue);
        st.execute();
        st.close();
    }
    catch (SQLException e)  {
        System.out.println(e.getMessage());
    }
    finally     {
        if (con != null) {
            try { con.close(); } // assure connection "goes" back to the pool
            catch (SQLException e)  { }
        }
    }
}

现在让我们假设这个方法callProcedure可能会被召唤数百万次。我的问题是:

(1。)如果我在类的构造函数中创建连接并且在构造函数中创建prepare_the_Call,那么它会更好(性能明智),所以这样的事情:

CallableStatement st;

public Constructor() {
   Connection con = connectionPool.getConnection();
   st = con.prepareCall("{call some_procedure(?)}");
}

然后在方法内执行:

   public void callProcedure(int someValue) {
    try {
        st.setInt(1, someValue);
        st.execute();
        st.close();
    }
    catch (SQLException e)  {
        System.out.println(e.getMessage());
    }
    finally     {
        if (con != null) {
            try { con.close(); } // assure connection "goes" back to the pool
            catch (SQLException e)  { }
        }
    }
    }

(2。)执行语句后,close连接是否有意义?或者我应该把它打开?根据我的理解,关闭它会将连接返回到连接池,以便其他人可以使用它。这是对的吗?

1 个答案:

答案 0 :(得分:1)

  1. 将该语句放在构造函数中不会导致性能提升。您只是在对象生命周期的不同点创建Connection。

  2. 您是对的,关闭Connection会立即将其返回到连接池,而不是等待它自动发生。最好这样做。