如何启动JDBC Debug模式,打印JDBC诊断日志

2025-03-23 18:51:50
推荐回答(1个)
回答(1):

您好,很高兴为您解答。

1.下载Debug版本jar包

首先要下载一个Debug版本的JDBC jar包,Debug版本的jar包命名形式为jdbcX_g.jar


2.启动Logging模式

第一种方式:设置运行环境变量 java -Doracle.jdbc.Trace=true ...(elipse中run->run configurations->arguments一栏)


第二种方式:在程序中控制(建议采用这种方式)

MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
      String loader = Thread.currentThread().getContextClassLoader().toString().replaceAll("[,=:\"]+", "");
      ObjectName pattern = new ObjectName("com.oracle.jdbc:type=diagnosability,name=" + loader);
      ObjectName diag = ((ObjectName[]) (mbs.queryNames(pattern, null).toArray(new ObjectName[0])))[0];
      mbs.setAttribute(diag, new Attribute("LoggingEnabled", true));
      System.out.println("LoggingEnabled = " + mbs.getAttribute(diag, "LoggingEnabled"));


如果用的是Oracle 10g,直接执行:

/**oracle 10g 启动方法*/
      oracle.jdbc.driver.OracleLog.setTrace(true); // enable logging
      oracle.jdbc.driver.OracleLog.setTrace(false); // disable logging


3.配置log文件

jdbc使用的是 java.util.logging包中的Logger对象打印log。

/**配置log文件*/
     Handler fh = new FileHandler("./oracle_jdbc_log.log");
     fh.setLevel(Level.ALL);
     fh.setFormatter(new SimpleFormatter());
     Logger.getLogger("").addHandler(fh);
     Logger.getLogger("").setLevel(Level.ALL);


完成的Demo

import javax.management.Attribute;
import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.InvalidAttributeValueException;
import javax.management.MBeanException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.ReflectionException;
public void run() throws SQLException {
   DriverManager.registerDriver(new OracleDriver());
   //需在加载OracleDriver之后开启log
   enableOracleLogging();
   Connection conn = null;
   Statement stmt = null;
   ResultSet rset = null;
   try {
     conn = getConnection();
     System.out.println("Connection retrieved..");
     stmt = conn.createStatement();
     rset = stmt.executeQuery("select empno from emp");
     while (rset.next()) {
       System.out.println(rset.getInt(1));
     }
   } catch (SQLException sqle) {
     sqle.printStackTrace();
   } finally {
     if (rset != null) {
       rset.close();
     }
     if (stmt != null) {
       stmt.close();
     }
     if (conn != null) {
       conn.close();
     }
   }
 }
public static void enableOracleLogging() {
   try {
     /** 配置log文件 */
     Handler fh = new FileHandler("./oracle_jdbc_log.log");
     fh.setLevel(Level.ALL);
     fh.setFormatter(new SimpleFormatter());
     Logger.getLogger("").addHandler(fh);
     Logger.getLogger("").setLevel(Level.ALL);
     /** oracle 11g 启动方法 */
     MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
     String loader = Thread.currentThread().getContextClassLoader().toString().replaceAll("[,=:\"]+", "");
     ObjectName pattern = new ObjectName("com.oracle.jdbc:type=diagnosability,name=" + loader);
     ObjectName diag = ((ObjectName[]) (mbs.queryNames(pattern, null).toArray(new ObjectName[0])))[0];
     mbs.setAttribute(diag, new Attribute("LoggingEnabled", true));
     System.out.println("LoggingEnabled = " + mbs.getAttribute(diag, "LoggingEnabled"));
     /** oracle 10g 启动方法 */
     // oracle.jdbc.driver.OracleLog.setTrace(true); // enable logging
     // oracle.jdbc.driver.OracleLog.setTrace(false); // disable logging

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


如若满意,请点击右侧【采纳答案】,如若还有问题,请点击【追问】

希望我的回答对您有所帮助,望采纳!

                                                                                                                            ~ O(∩_∩)O~