diff --git a/skywalking-collector/pom.xml b/skywalking-collector/pom.xml
index ba8089913..d49082920 100644
--- a/skywalking-collector/pom.xml
+++ b/skywalking-collector/pom.xml
@@ -36,8 +36,8 @@
maven-compiler-plugin
- 1.6
- 1.6
+ 1.7
+ 1.7
${project.build.sourceEncoding}
diff --git a/skywalking-collector/skywalking-sdk-plugin/jdbc-plugin/pom.xml b/skywalking-collector/skywalking-sdk-plugin/jdbc-plugin/pom.xml
index de60ee5f3..4bdacbc70 100755
--- a/skywalking-collector/skywalking-sdk-plugin/jdbc-plugin/pom.xml
+++ b/skywalking-collector/skywalking-sdk-plugin/jdbc-plugin/pom.xml
@@ -35,6 +35,12 @@
10.2.0.4.0
test
+
+ com.h2database
+ h2
+ 1.4.192
+ test
+
diff --git a/skywalking-collector/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/JDBCPluginDefine.java b/skywalking-collector/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/JDBCPluginDefine.java
index 713d8d946..93e5b6c8c 100644
--- a/skywalking-collector/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/JDBCPluginDefine.java
+++ b/skywalking-collector/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/JDBCPluginDefine.java
@@ -18,9 +18,7 @@ public class JDBCPluginDefine extends BootPluginDefine {
protected void boot() throws BootException {
try {
Class> classes = Class.forName("java.sql.DriverInfo");
- Constructor> constructor = classes.getDeclaredConstructor(Driver.class);
- constructor.setAccessible(true);
- Object traceDriverInfo = constructor.newInstance(new TracingDriver());
+ Object traceDriverInfo = newDriverInfoInstance(classes);
Field field = DriverManager.class.getDeclaredField("registeredDrivers");
field.setAccessible(true);
@SuppressWarnings("unchecked")
@@ -34,4 +32,16 @@ public class JDBCPluginDefine extends BootPluginDefine {
TracingDriver.registerDriver();
}
}
+
+ private Object newDriverInfoInstance(Class> classes) throws NoSuchMethodException, InstantiationException, IllegalAccessException, java.lang.reflect.InvocationTargetException {
+ //DriverInfo 只有一个构造函数
+ Constructor constructor = classes.getDeclaredConstructors()[0];
+ constructor.setAccessible(true);
+ // JDK 1.7 DriverInfo 只有一个Driver入参构造函数
+ if (constructor.getParameterTypes().length == 1){
+ return constructor.newInstance(new TracingDriver());
+ }
+ // JDK1.8 DriverInfo 有两个入参的构造函数(Driver, DriverAction)
+ return constructor.newInstance(new TracingDriver(), null);
+ }
}
diff --git a/skywalking-collector/skywalking-sdk-plugin/jdbc-plugin/src/main/resources/driver-mapping-url.def b/skywalking-collector/skywalking-sdk-plugin/jdbc-plugin/src/main/resources/driver-mapping-url.def
index 3df5601ab..2af3bc561 100644
--- a/skywalking-collector/skywalking-sdk-plugin/jdbc-plugin/src/main/resources/driver-mapping-url.def
+++ b/skywalking-collector/skywalking-sdk-plugin/jdbc-plugin/src/main/resources/driver-mapping-url.def
@@ -5,4 +5,5 @@ jdbc:microsoft:sqlserver=com.microsoft.jdbc.sqlserver.SQLServerDriver
jdbc:sqlserver=com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc:jtds:sqlserver=net.sourceforge.jtds.jdbc.Driver
jdbc:db2=com.ibm.db2.jcc.DB2Driver
-jdbc:informix-sqli=com.informix.jdbc.IfxDriver
\ No newline at end of file
+jdbc:informix-sqli=com.informix.jdbc.IfxDriver
+jdbc:h2=org.h2.Driver
\ No newline at end of file
diff --git a/skywalking-collector/skywalking-sdk-plugin/jdbc-plugin/src/test/java/test/ai/cloud/skywalking/plugin/h2/H2JDBCTest.java b/skywalking-collector/skywalking-sdk-plugin/jdbc-plugin/src/test/java/test/ai/cloud/skywalking/plugin/h2/H2JDBCTest.java
new file mode 100644
index 000000000..3d208f312
--- /dev/null
+++ b/skywalking-collector/skywalking-sdk-plugin/jdbc-plugin/src/test/java/test/ai/cloud/skywalking/plugin/h2/H2JDBCTest.java
@@ -0,0 +1,36 @@
+package test.ai.cloud.skywalking.plugin.h2;
+
+import com.ai.cloud.skywalking.plugin.TracingBootstrap;
+import com.ai.skywalking.testframework.api.RequestSpanAssert;
+import org.junit.Test;
+
+import java.lang.reflect.InvocationTargetException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+public class H2JDBCTest {
+ @Test
+ public void testMySqlJDBC() throws InvocationTargetException, NoSuchMethodException, ClassNotFoundException, IllegalAccessException {
+ TracingBootstrap.main(new String[]{H2JDBCTest.class.getName()});
+ }
+
+ public static void main(String[] args) throws ClassNotFoundException, SQLException, InterruptedException {
+ Class.forName("org.h2.Driver");
+ String url = "jdbc:h2:" + H2JDBCTest.class.getResource("/") + "test.db";
+ Connection con = DriverManager.getConnection(url);
+ con.setAutoCommit(false);
+
+ PreparedStatement p0 = con.prepareStatement("select 1 from dual where 1=?");
+ p0.setInt(1, 1);
+ p0.execute();
+ con.commit();
+ con.close();
+ RequestSpanAssert.assertEquals(
+ new String[][]{{"0", "jdbc:h2:" +H2JDBCTest.class.getResource("/") + "test.db" + "(null)", "preaparedStatement.executeUpdate:select 1 from dual where 1=?"},
+ {"0", "jdbc:h2:" +H2JDBCTest.class.getResource("/") + "test.db" + "(null)", "connection.commit"},
+ {"0", "jdbc:h2:" +H2JDBCTest.class.getResource("/") + "test.db" + "(null)", "connection.close"},}, true);
+
+ }
+}