From 7f737de9ef0551f7c4cbf92651ab518e998b6a67 Mon Sep 17 00:00:00 2001 From: ascrutae Date: Fri, 22 Jul 2016 17:19:23 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E6=94=B9Pluin=E7=9A=84=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E7=BA=A7=E5=88=AB=20=202.=20=E6=94=AF=E6=8C=81H2?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=20=203.=20=E4=BF=AE=E5=A4=8DJDBC?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=9C=A8JDK1.8=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- skywalking-collector/pom.xml | 4 +-- .../skywalking-sdk-plugin/jdbc-plugin/pom.xml | 6 ++++ .../plugin/jdbc/JDBCPluginDefine.java | 16 +++++++-- .../src/main/resources/driver-mapping-url.def | 3 +- .../skywalking/plugin/h2/H2JDBCTest.java | 36 +++++++++++++++++++ 5 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 skywalking-collector/skywalking-sdk-plugin/jdbc-plugin/src/test/java/test/ai/cloud/skywalking/plugin/h2/H2JDBCTest.java 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); + + } +}