【问题标题】:Java Database Connection Down GlassfishJava 数据库连接关闭 Glassfish
【发布时间】:2014-07-01 01:15:52
【问题描述】:

我需要检查数据库连接是否断开,然后发送电子邮件。下面是代码:

public static void main(String[] args) {
     try {
         Connection connection = DriverManager.getConnection("url", "username", "password");
         Statement statement = connection.createStatement();
         ResultSet resultSet = statement.executeQuery("SELECT * FROM Table");
    }
    catch(SQLException e) {
        if(e.getMessage().contains(new String("ORA-12543"))) {
           // send email
        }
    }
}

我使用这个网站来确定Oracle数据库何时关闭:http://www.dbmotive.com/ora-12543-tnsdestination-host-unreachable/

现在,我想在 Glassfish 中设置 JDBC 资源和 JDBC 连接池并使用那里的连接。我从来没有用过Glassfish。我似乎找不到我要找的东西。曾经,我已经在 Glassfish 中设置了资源和连接池,我想根据上面的代码知道数据库是否已关闭,此代码是否仍然有效或会有任何更改。我想知道数据库何时关闭,然后发送电子邮件。

请注意上面的代码是示例,但在我的主代码中存在此代码。

【问题讨论】:

  • 最好:if(e.getErrorCode()==12543)

标签: java oracle glassfish sqlexception


【解决方案1】:

恕我直言,一旦您使用通过 JNDI 数据源检索的连接,您将需要使用以下代码。 (找到here:) 我还在下面提供了有关如何检索 JNDI 数据源的详细信息。

■3113:“通信通道上的文件结束”

■3114:“未连接到 ORACLE”

■1033:“ORACLE 初始化或关闭正在进行中”

■1034:“ORACLE 不可用”

■1089:“正在立即关闭 - 不允许任何操作”

■1090:“正在关机 - 不允许连接”

■17002:“I/O 异常”

============================ 从数据源检索连接的代码

InitialContext ic = new InitialContext();
     com.sun.appserv.DataSource ds = (com.sun.appserv.DataSOurce) ic.lookup("jdbc/PointBase"); 
     Connection con = ds.getConnection();
     Connection drivercon = ds.getConnection(con);

Glassfish 数据源 javadoc 是 here

如果您不想部署应用程序,而是使用远程 glassfish 服务器的数据源,请获取initialcontext,如下所示

Properties props=new Properties();    
            props.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFactory");    
            props.put(Context.PROVIDER_URL,"iiop://URL_OF_APP_SERVER:PORT");    
            Context ctx=new InitialContext(props);    
            DataSource datasource = (DataSource)ctx.lookup("jndi/mydatasource");   

【讨论】:

  • 嗯,上面的链接是通过:stackoverflow.com/questions/18756113/…找到的
  • 查看了您的链接,它确实说明了这些错误代码,但是这些错误代码是在使用 Glassfish JDBC 资源和 JDBC 连接池时出现的,还是这些错误代码可以在正常的独立应用程序下工作?
  • 对于数据源,您需要一个应用服务器。即使你的应用程序是独立的,它也需要引用一些应用服务器提供的 JNDI。在您的情况下,服务器是 glassfish。这是一个符合 J2EE 的服务器。所以错误码应该是一样的
  • 因此,如果我不部署到 Glassfish 并按照静态 main 方法中的上述代码运行应用程序,您提供的这些错误代码是否仍然可以确定数据库已关闭?
  • 我已经编辑了我的答案并提供了更多信息。请检查。
【解决方案2】:

使用问题中的信息,您想创建一个 jdbc 资源,即 Glassfish 实例中的数据源。您也可以为它创建一个连接池。请关注此link 以了解如何操作。你必须改变你的代码有点像使用 JNDI 查找

   DataSource ds = (DataSource) new InitialContext().lookup("jdbc/YOUR_DATASOURCE_NAME");
   Connection con = ds.getConnection();

而不是使用带有数据库配置和凭据的 DriverManager 获取连接,因为所有这些信息都将在 Glassfish 服务器中配置为数据源。基于 JNDI 的数据源用于解耦开发人员和部署人员的工作。开发者无需了解数据库服务器的配置。只需知道数据源名称即可满足开发需求。此外,管理多个应用程序以使用单个数据源连接到同一个数据库非常简单,而无需单独部署每个应用程序中的数据源配置。我建议您查看oracle documentation(检查正确版本)的错误代码以具体处理案例。

【讨论】:

    猜你喜欢
    • 2012-07-12
    • 2011-01-14
    • 2012-01-06
    • 1970-01-01
    • 2016-12-31
    • 2020-09-16
    • 1970-01-01
    • 2011-10-19
    相关资源
    最近更新 更多