如何为 JDBC Connection 设置时区,避免找不到 SqlException 时区?

Posted

技术标签:

【中文标题】如何为 JDBC Connection 设置时区,避免找不到 SqlException 时区?【英文标题】:How to set the timezone region for JDBC Connection and avoid the SqlException timezone region not found? 【发布时间】:2015-02-11 10:53:52 【问题描述】:

我在尝试创建 Connection 对象以处理来自命令行 Java 应用程序和 Oracle 数据库的连接时遇到以下问题。

所以我有一个包含 ma​​in() 方法的 Main 类,这个:

import java.sql.*;
import oracle.jdbc.OracleDriver;

public class Main 

    public static void main(String[] args) 
        System.out.println("Hello World !!!");

        String partitaIVA = args[0];
        String nomePDF = args[1];

        Connection conn = null;
        Statement  stmt = null;

        try 
            Class.forName ("oracle.jdbc.OracleDriver");
            // Step 1: Allocate a database "Connection" object
            conn = DriverManager.getConnection("jdbc:oracle:thin:@XXX.XXX.XXX.XXX:1521:eme1", "myUserName", "myPswd"); // Oracle DB

         catch(SQLException ex) 
            ex.printStackTrace();
         catch (ClassNotFoundException e) 
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        
    

问题是当我尝试执行此指令时:

conn = DriverManager.getConnection("jdbc:oracle:thin:@XXX.XXX.XXX.XXX:1521:eme1", "myUserName", "myPswd"); // Oracle DB

我得到这个异常:

java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1
ORA-01882: timezone region  not found

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:392)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:385)
    at oracle.jdbc.driver.T4CTTIfun.processError(T4CTTIfun.java:1018)
    at oracle.jdbc.driver.T4CTTIoauthenticate.processError(T4CTTIoauthenticate.java:497)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:522)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:433)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:950)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:639)
    at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:662)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:560)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:185)
    at Main.main(Main.java:21)

所以,我记得在使用此数据库的其他一些应用程序中,有必要设置时区或类似的东西(但现在我无法访问这些应用程序)。

那么,我该如何解决这个问题?我可以以编程方式为我的 Connection 设置时区吗?

Tnx

【问题讨论】:

【参考方案1】:

在尝试连接之前写下:

TimeZone timeZone = TimeZone.getTimeZone("yourTimeZone"); // e.g. "Europe/Rome"
TimeZone.setDefault(timeZone);

所以整个代码是:

try 
    TimeZone timeZone = TimeZone.getTimeZone("yourTimeZone");
    TimeZone.setDefault(timeZone);
    Class.forName("oracle.jdbc.OracleDriver");
    conn = DriverManager.getConnection("connStr", "myUserName", "myPswd");
    ...

如果这不起作用,则问题可能是无效的 JDBC 驱动程序版本。

【讨论】:

现在我试试,你能说我需要导入什么包才能使用 TimeZone 对象吗? java.util.TimeZone docs.oracle.com/javase/7/docs/api/java/util/TimeZone.html setDefault() 的调用范围是什么? javadoc 表示“设置由 getDefault 方法返回的 TimeZone。”:这会在多大程度上影响其他正在运行的代码?它是否仅限于执行调用的单个应用程序或整个 JVM,并且可能会改变在其中运行的其他应用程序(即在 servlet 容器中)? AFAIK 这是一个 JVM 级别的设置,但我会提出一个新问题,因为这是一个很好的问题

以上是关于如何为 JDBC Connection 设置时区,避免找不到 SqlException 时区?的主要内容,如果未能解决你的问题,请参考以下文章

如何为每个线程设置时区? [关闭]

如何为 Jruby Oracle 连接设置 SSL?

如何为 Google 课堂课程设置正确的时区

如何为 AWS RDS 实例设置数据库时区 [重复]

如何为 ASP.NET MVC 5 应用程序设置时区?

JDBC以及连接池连接MySQL出现时区错误问题--An attempt by a client to checkout a Connection has timed out