在Google app Engine app中注册jdbc驱动程序的正确方法

时间:2012-12-23 23:27:31

标签: java google-app-engine google-cloud-sql

我正在开展一个项目,我们将GAE与Google Cloud SQL结合使用。我已经按照本教程https://developers.google.com/appengine/docs/java/cloud-sql/developers-guide#use_with_lang来学习如何连接到数据库,到目前为止除了驱动程序注册部分之外一切正常。我的直觉告诉我,驱动程序应该只注册一次,但我不知道何时何地是最好的地方。 gae中是否有一种初始化功能可以在实例启动时执行某些代码?或者可能是一个可以加载资源的xml文件?

到目前为止,我的代码看起来像这样:

    try {
        // Connect to the db.
        DriverManager.registerDriver(new AppEngineDriver());
        Connection c = DriverManager.getConnection(JDBC_CON_STRING);

        // Fetch rows
        String sql = "SELECT * FROM test";
        ResultSet rs = c.createStatement().executeQuery(sql);
        ArrayList<BaseUser> users = new ArrayList<BaseUser>();
        while(rs.next()){
            BaseUser u = new BaseUser();
            u.setFirstname(rs.getString("firstname"));
            u.setLastname(rs.getString("lastname"));
            users.add(u);
        }
        rs.close();
        c.close();
        // Print the users in the console.
        for (BaseUser user : users) {
            logger.info("Firstname: " + user.getFirstname() + ", Lastname: " + user.getLastname());
        }

    } catch (SQLException e) {
        e.printStackTrace();
    }

我想摆脱第一行,把它放在只执行一次的地方然后,每当我收到一个需要sql事务的请求时,我只需要调用DriverManager.getConnection(... )

谢谢你, 罗德里戈。

1 个答案:

答案 0 :(得分:3)

所以我终于在google的doc中找到了一种“在调用任何servlet之前运行自定义逻辑”的更好方法。这是:只需在web.xml中注册一个ServletContextListener,并覆盖contextInitialized方法,在我的例子中,是自定义驱动程序注册。

这是web.xml代码:

<web-app>
    ...
   <welcome-file-list>
       <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>

   <listener>
       <listener-class>com.my.project.ClassName</listener-class>
   </listener>
</web-app>

contextInitializeMethod:

@Override
public void contextInitialized(ServletContextEvent arg) {
    try {
        DriverManager.registerDriver(new AppEngineDriver());
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

以下是指向实际Google指南的链接:https://developers.google.com/appengine/docs/java/config/appconfig#Using_a_ServletContextListener

希望对有类似问题的人有所帮助。