请教道友:Statement可否集成到连接池中?

04-11-01 chabulier
开始在连接池管理类中定义了一个Statement属性,使用他来执行查询,结果发现如果查询方法不同步,则多个用户并发访问时,程序中又包含对结果集的操作,就会导致偶尔的取不到结果集,如果要求开发人员传入一个Connection自己创建一个Statement的话,关闭这个Statement就成了问题,请教各位道友各抒己见给个看法,本人刚学java,不知道这个想法是不是很可笑,谢谢了先

chabulier
2004-11-01 13:28
如果同步这个方法肯定会大大影响性能,而不同步的话,现在的Singleton模式连接池管理类肯定会导致查询受阻,但是好像更新不太受影响,因为更新我们可以要求程序员传当前连接进来,自己生成Statement对象,完后关闭他.这个问题的需求是:希望程序员可以不用生成Statement,直接执行SQL语句.

chabulier
2004-11-01 15:56

    public ResultSet executeQuery(String querySQL, Connection con) throws SQLException
    {
Connection conn = (Connection)con;
        Statement st = conn.createStatement();
        ResultSet rs = null;
        try
        {
            rs = st.executeQuery(querySQL);
            ResultSetAdapter rsAdapter = new ResultSetAdapter(rs);
            ResultSetAdapter rsAdapterReturn = rsAdapter;
			loghelper.info("executeQuery", "end");
            return rsAdapterReturn;
        }
        catch (SQLException ex)
        {
			while(ex != null)
			{
				if (ex.getSQLState() !=null && ex.getSQLState().equals("40001"))
				{
					System.out.println( "deadlock occur.");
				}else if(ex.getSQLState() !=null && (ex.getSQLState().equals("40XL1") || ex.getSQLState().equals("40XL2")))
				{
					System.out.println( "lockwait timeout.");
				}
				ex.printStackTrace();
				ex = ex.getNextException();	
			}
			loghelper.info("executeQuery", "end");
            return null;
        }
        finally
        {
//           st.close();
        }

    }

chabulier
2004-11-01 16:01
    public ResultSet executeQuery(String querySQL, Connection con) throws SQLException
    {
Connection conn = (Connection)con;
        Statement st = conn.createStatement();
        ResultSet rs = null;
        try
        {
            rs = st.executeQuery(querySQL);
            return rs;
        }
        catch (SQLException ex)
        {
		while(ex != null)
		{
			ex.printStackTrace();
			ex = ex.getNextException();	
		}
		return null;
        }
        finally
        {
             //           here I can't use close() method 
//           st.close();
        }

    }

猜你喜欢