2014-06-17 4 views
0

요청합니다의 ClassNotFoundException 내가이 예외를 받고 있어요

java.lang.ClassNotFoundException: com.p6spy.engine.spy.P6SpyDriver 

에 P6Spy 프록시 드라이버를 통해 내 데이터베이스에 연결하는 동안. 이 예외는 코드 행을 가리키는 : 여기

################################################################# 
# P6Spy Options File           # 
# See documentation for detailed instructions     # 
################################################################# 

################################################################# 
# MODULES              # 
#                # 
# Modules provide the P6Spy functionality. If a module, such # 
# as module_log is commented out, that functionality will not # 
# be available. If it is not commented out (if it is active), # 
# the functionality will be active.        # 
#                # 
# Values set in Modules cannot be reloaded using the   # 
# reloadproperties variable. Once they are loaded, they remain # 
# in memory until the application is restarted.     # 
#                # 
################################################################# 

#module.log=com.p6spy.engine.logging.P6LogFactory 
#module.outage=com.p6spy.engine.outage.P6OutageFactory 

################################################################# 
# REALDRIVER(s)             # 
#                # 
# In your application server configuration file you replace the # 
# "real driver" name with com.p6spy.engine.P6SpyDriver. This is # 
# where you put the name of your real driver P6Spy can find and # 
# register your real driver to do the database work.   # 
#                # 
# If your application uses several drivers specify them in  # 
# realdriver2, realdriver3. See the documentation for more  # 
# details.              # 
#                # 
# Values set in REALDRIVER(s) cannot be reloaded using the  # 
# reloadproperties variable. Once they are loaded, they remain # 
# in memory until the application is restarted.     # 
#                # 
################################################################# 

# oracle driver 
realdriver=oracle.jdbc.driver.OracleDriver 

# mysql Connector/J driver 
# realdriver=com.mysql.jdbc.Driver 

# informix driver 
# realdriver=com.informix.jdbc.IfxDriver 

# ibm db2 driver 
# realdriver=COM.ibm.db2.jdbc.net.DB2Driver 

# the mysql open source driver 
#realdriver=org.gjt.mm.mysql.Driver 

#specifies another driver to use 
#realdriver2= 
#specifies a third driver to use 
#realdriver3= 


#the DriverManager class sequentially tries every driver that is 
#registered to find the right driver. In some instances, it's possible to 
#load up the realdriver before the p6spy driver, in which case your connections 
#will not get wrapped as the realdriver will "steal" the connection before 
#p6spy sees it. Set the following property to "true" to cause p6spy to 
#explicitily deregister the realdrivers 
deregisterdrivers=false 

################################################################ 
# P6LOG SPECIFIC PROPERTIES         # 
################################################################ 
# no properties currently available 

################################################################ 
# EXECUTION THRESHOLD PROPERTIES        # 
################################################################ 
# This feature applies to the standard logging of P6Spy.  # 
# While the standard logging logs out every statement   # 
# regardless of its execution time, this feature puts a time # 
# condition on that logging. Only statements that have taken # 
# longer than the time specified (in milliseconds) will be  # 
# logged. This way it is possible to see only statements that # 
# have exceeded some high water mark.       # 
# This time is reloadable.          # 
# 
# executionthreshold=integer time (milliseconds) 
# 
#executionthreshold= 

################################################################ 
# P6OUTAGE SPECIFIC PROPERTIES         # 
################################################################ 
# Outage Detection 
# 
# This feature detects long-running statements that may be indicative of 
# a database outage problem. If this feature is turned on, it will log any 
# statement that surpasses the configurable time boundary during its execution. 
# When this feature is enabled, no other statements are logged except the long 
# running statements. The interval property is the boundary time set in seconds. 
# For example, if this is set to 2, then any statement requiring at least 2 
# seconds will be logged. Note that the same statement will continue to be logged 
# for as long as it executes. So if the interval is set to 2, and the query takes 
# 11 seconds, it will be logged 5 times (at the 2, 4, 6, 8, 10 second intervals). 
# 
# outagedetection=true|false 
# outagedetectioninterval=integer time (seconds) 
# 
outagedetection=false 
#outagedetectioninterval= 

################################################################ 
# COMMON PROPERTIES           # 
################################################################ 

# filter what is logged 
filter=false 

# comma separated list of tables to include when filtering 
include  = 
# comma separated list of tables to exclude when filtering 
exclude  = 

# sql expression to evaluate if using regex filtering 
#sqlexpression = 


# turn on tracing 
#autoflush = true 

# sets the date format using Java's SimpleDateFormat routine 
dateformat=yyyy-MM-dd 

#list of categories to explicitly include 
#includecategories= 

#list of categories to exclude: error, info, batch, debug, statement, 
#commit, rollback and result are valid values 
excludecategories= 


#allows you to use a regex engine or your own matching engine to determine 
#which statements to log 
# 
#stringmatcher=com.p6spy.engine.common.GnuRegexMatcher 
#stringmatcher=com.p6spy.engine.common.JakartaRegexMatcher 
#stringmatcher= 

# prints a stack trace for every statement logged 
stacktrace=false 
# if stacktrace=true, specifies the stack trace to print 
#stacktraceclass= 

# determines if property file should be reloaded 
#reloadproperties=false 
# determines how often should be reloaded in seconds 
#reloadpropertiesinterval=60 

#if=true then url must be prefixed with p6spy: 
useprefix=true 

#specifies the appender to use for logging 
#appender=com.p6spy.engine.logging.appender.Log4jLogger 
#appender=com.p6spy.engine.logging.appender.StdoutLogger 
appender=com.p6spy.engine.logging.appender.FileLogger 

# name of logfile to use, note Windows users should make sure to use forward slashes in their pathname (e:/test/spy.log) (used for file logger only) 
logfile  = D:/spy.log 

# append to the p6spy log file. if this is set to false the 
# log file is truncated every time. (file logger only) 
append=true 

#The following are for log4j logging only 
#log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender 
#log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout 
#log4j.appender.STDOUT.layout.ConversionPattern=p6spy - %m%n 

#log4j.appender.CHAINSAW_CLIENT=org.apache.log4j.net.SocketAppender 
#log4j.appender.CHAINSAW_CLIENT.RemoteHost=localhost 
#log4j.appender.CHAINSAW_CLIENT.Port=4445 
#log4j.appender.CHAINSAW_CLIENT.LocationInfo=true 

#log4j.logger.p6spy=INFO,STDOUT 


################################################################# 
# DataSource replacement          # 
#                # 
# Replace the real DataSource class in your application server # 
# configuration with the name com.p6spy.engine.spy.P6DataSource,# 
# then add the JNDI name and class name of the real   # 
# DataSource here        # 
#                # 
# Values set in this item cannot be reloaded using the   # 
# reloadproperties variable. Once it is loaded, it remains  # 
# in memory until the application is restarted.     # 
#                # 
################################################################# 
#realdatasource=/RealMySqlDS 
#realdatasourceclass=com.mysql.jdbc.jdbc2.optional.MysqlDataSource 

################################################################# 
# DataSource properties           # 
#                # 
# If you are using the DataSource support to intercept calls # 
# to a DataSource that requires properties for proper setup, # 
# define those properties here. Use name value pairs, separate # 
# the name and value with a semicolon, and separate the   # 
# pairs with commas.           # 
#           # 
# The example shown here is for mysql       # 
#                # 
################################################################# 
#realdatasourceproperties=port;3306,serverName;ibmhost,databaseName;mydb 


################################################################# 
# JNDI DataSource lookup          # 
#                # 
# If you are using the DataSource support outside of an app  # 
# server, you will probably need to define the JNDI Context  # 
# environment.             # 
#                # 
# If the P6Spy code will be executing inside an app server then # 
# do not use these properties, and the DataSource lookup will # 
# use the naming context defined by the app server.    # 
#                # 
# The two standard elements of the naming environment are # 
# jndicontextfactory and jndicontextproviderurl. If you need # 
# additional elements, use the jndicontextcustom property.  # 
# You can define multiple properties in jndicontextcustom,  # 
# in name value pairs. Separate the name and value with a  # 
# semicolon, and separate the pairs with commas.    # 
#                # 
# The example shown here is for a standalone program running on # 
# a machine that is also running JBoss, so the JDNI context  # 
# is configured for JBoss (3.0.4).        # 
#                # 
################################################################# 
#jndicontextfactory=org.jnp.interfaces.NamingContextFactory 
#jndicontextproviderurl=localhost:1099 
#jndicontextcustom=java.naming.factory.url.pkgs;org.jboss.nameing:org.jnp.interfaces 

#jndicontextfactory=com.ibm.websphere.naming.WsnInitialContextFactory 
#jndicontextproviderurl=iiop://localhost:900 

append=true  

과 :

Class.forName("com.p6spy.engine.spy.P6SpyDriver"); 

나는 buildpath에에 p6spy.jar 및 spy.properties을 추가, 여기에 spy.properties 구성 파일입니다 내 연결 클래스 :

public class ConnexionBD { 
     private static final ConnexionBD INSTANCE= new ConnexionBD(); 
     private String host; 
     private String database; 
     private int port; 
     private String login; 
     private char[] password; 
     private String privileges; 
     private Connection connection; 
     public static final String DATABASE_JDBC_DRIVER = "com.p6spy.engine.spy.P6SpyDriver"; 

    private ConnexionBD() {} 

    public static ConnexionBD getInstance() { 
     return INSTANCE; 
    } 


    //getters and setters... 

    public Connection getConnection() throws ClassNotFoundException, SQLException { 
     String DATABASE_URL=null; 

     DATABASE_URL = "p6spy:jdbc:oracle:thin:@"+getHost()+":"+getPort()+":"+getDatabase(); 

     if (connection!=null) 
     { 
      return connection ; 
     } 
     else{ 
      Class.forName(DATABASE_JDBC_DRIVER); 

      connection = DriverManager.getConnection(DATABASE_URL,getLogin(),new String(getPassword())) ; 

      return connection ; 
     } 
    } 
    public void setConnection(Connection connection) { 
     this.connection = connection; 
    } 


} 

누군가가 나에게 무슨 문제가 있다고 말할 수 있습니까? 도움을 주시면 감사하겠습니다!

+0

어떤 버전의 p6spy를 사용하고 있습니까? – quintonm

답변

1

P6SpyDriver가 런타임에 클래스 경로에없는 것처럼 보입니다. 문 Class.forName(DATABASE_JDBC_DRIVER);은 ConnexionBD를로드 한 동일한 클래스 로더를 사용하여 P6SpyDriver를로드하려고 시도하고 있습니다. 어떤 이유로 든 클래스 로더는 클래스에 액세스 할 수 없습니다.

클래스 로더와 그 부모로 등록 된 URL 로깅을 권장합니다. 이것은 왜 이것이 일어나고 있는지에 대한 통찰력을 줄 것입니다. 클래스 경로 위치를 기록하는 방법에 대한 예는 아래 코드를 참조하십시오. 메서드를 ConnexionBD 클래스에 추가하고 Class.forName(DATABASE_JDBC_DRIVER); 바로 위의 줄에 logClassPath(this);을 추가하기 만하면됩니다.

내가 제공 한 코드는 URLClassloader의 인스턴스 인 클래스 로더에서만 작동합니다. 또한 계층 적 클래스 로더가 있다고 가정합니다. 가벼운 컨테이너에서 실행되는 일반 Java 응용 프로그램이나 웹 응용 프로그램의 경우에는 정상이어야합니다.

OSGI 기반 컨테이너에서 실행중인 경우 컨테이너가 클래스 로딩 문제를 해결하기 위해 제공하는 도구를 사용해야합니다.

+0

감사합니다 @quintonm, 내가 문제를 알아 냈어, 내 classpath에 맞는 항아리를 추가하지 못했습니다 :) 이제 P6Spy가 실행되고 있지만 로그 파일에 SQL 요청을 로깅하지 않습니다. 왜 그런지 모르겠습니다. 시도한 새로운 spy.properties로 내 질문을 업데이트했습니다. P6Spy가 p6spy 접두사를 사용하도록이 파일을 구성했습니다. [여기] (http://stackoverflow.com/questions/17749152/)와 같은 데이터베이스 URL을 사용하십시오. p6spy-not-logging-sql) 여전히 작동하지 않습니다. / – mounaim

관련 문제