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); + + } +}