Groovy DAO可变范围问题

时间:2014-11-04 22:05:19

标签: grails groovy dao

在我们的Grails项目中,我们使用一个通用的Groovy DAO访问带有PooledDataSource的Amazon Oracle数据库,但是事情没有用,我怀疑这是因为某些变量的范围不正确。我已经修改了代码并将名称更改为我们在多个位置执行的操作的一小部分。有些代码是由另一个开发人员编写的,他的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
    }
}

我对我们编写的代码有些担忧......

  1. 好像......

    Connection conn 
    PreparedStatement stmt
    String queryText
    
    ...不应该在Class级别,而是在每个方法中声明,以避免变量通过另一种方法(甚至是不同请求的相同方法)引起副作用。正确?请解释

  2. PooledDataSource是否应在Class级别声明以供重用。正确?请解释

  3. 我们是否需要在每个方法中执行ds.setDataSource(),或者应该为类完成一次以及为什么?
  4. 看起来如果try / catch适用于getUserCount和getUserMetrics方法,那么它也应该在getQuery方法中使用。正确?请解释

1 个答案:

答案 0 :(得分:1)

那个时髦的代码。只应共享DataSource。使用您最喜欢的搜索引擎进行Google搜索groovy.sql.Sql - 在Groovy或Grails项目中直接使用JDBC是最好的选择。它有许多辅助方法,可以让你编写直观的代码并让它完成繁重的任务。

您可能需要先查看Javadoc page for the class