3

我正在开展一个项目,我们将 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(...)

谢谢你,罗德里戈。

4

1 回答 1

3

所以我终于在谷歌的文档中找到了一种更好的方法来“在调用任何 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();
    }
}

这是实际谷歌指南的链接:https ://developers.google.com/appengine/docs/java/config/appconfig#Using_a_ServletContextListener

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

于 2013-01-02T17:07:18.937 回答