Grails Groovy DAO变量范围问题

Grails Groovy DAO变量范围问题,grails,groovy,dao,Grails,Groovy,Dao,在我们的Grails项目中,我们使用一个普通的Groovy DAO访问带有PooledDataSource的AmazonOracle数据库,但事情不起作用,我怀疑这是因为某些变量的范围不正确。我已经删减了代码,并将名称更改为我们在几个地方所做工作的一小部分。其中一些代码是由另一个比我有更多Java经验的开发人员编写的——我是一个相对Java/Groovy的新手——请原谅这些基本问题 class SomeDAO { MyPooledDataSource ds = new MyPooledD

在我们的Grails项目中,我们使用一个普通的Groovy DAO访问带有PooledDataSource的AmazonOracle数据库,但事情不起作用,我怀疑这是因为某些变量的范围不正确。我已经删减了代码,并将名称更改为我们在几个地方所做工作的一小部分。其中一些代码是由另一个比我有更多Java经验的开发人员编写的——我是一个相对Java/Groovy的新手——请原谅这些基本问题

class SomeDAO {
    MyPooledDataSource ds = new MyPooledDataSource()
    Connection conn
    PreparedStatement stmt
    String queryText

    public String getUserCount() {
        String jsonOne
        PojoOne one = new PojoOne()

        ds.setDataSource()
        conn = ds.getPooled()
        queryText = getQuery("SomeQuery")

        try {
            stmt = conn.prepareStatement(queryText)
            stmt.setString(1, 'YTD')
            stmt.setString(2, '2014')
            ResultSet rs = stmt.executeQuery()

            while (rs.next()) {
                one.setUsers(rs.getString("USER_CT"))
                one.setDropped(rs.getString("DROPPED_CT"))
            }
        } catch (SQLException e) {}

        jsonOne = (one as JSON).toString()
        return jsonOne
    }

    public String getUserMetrics() {
        String jsonTwo
        ArrayList objArray = new ArrayList()

        ds.setDataSource()
        conn = ds.getPooled()

        try {
            queryText = getQuery("SomeOtherQuery")
            stmt = conn.prepareStatement(queryText)
            stmt.setString(1, 'YTD')
            stmt.setString(2, '2014')
            ResultSet rsQuery = stmt.executeQuery()

            while (rsQuery.next()) {
                PojoTwo two = new PojoTwo()
                two.setDisplay(rsQuery.getString("NAME"))
                two.setDescription(rsQuery.getString("DESC"))
                two.setValue(rsQuery.getString("AMT"))
                objArray.add(two)
            }
        } catch (SQLException e) {}

        jsonTwo = (objArray as JSON).toString()
        return jsonTwo
    }

    public String getQuery(String operationName){
        String query = "select QRY_TXT from T_SVC_QRY where OPERATION_NM = '" + operationName + "'"
        ResultSet rs

        ds.setDataSource()
        conn = ds.getPooled()
        stmt = conn.prepareStatement(query)
        rs = stmt.executeQuery(query)
        while (rs.next()) {
            queryText = rs.getString("QRY_TXT")
        }
        return queryText
    }
}
我对我们编写的代码有一些担心

  • 好像。。。
    
    连接接头
    准备好的报表
    字符串查询文本
    
    …不应在类级别上,而是在每个方法中声明,以避免变量被另一个方法(或甚至同一个方法被不同的请求)突变而导致副作用。对的请解释一下

  • 应在类级别声明PooledDataSource以供重用。对的请解释一下

  • 我们需要在每个方法中执行ds.setDataSource(),还是应该为类执行一次,为什么
  • 如果try/catch适合于getUserCount和getUserMetrics方法,那么它也应该用于getQuery方法。对的请解释一下

  • 这是一个时髦的代码。应该只共享数据源。使用您最喜欢的groovy.sql.sql搜索引擎进行Google搜索—这是在groovy或Grails项目中直接使用JDBC的最佳选择。它有很多助手方法,可以让您编写直观的代码,并让它完成繁重的工作

    您可能希望首先查看

    Connection conn PreparedStatement stmt String queryText