首先用jdbc连接数据库sql server 2000与sql server 2005/2008就有很大的不同。以前连接sql server 2000时需要用到至少三个包,包括mssqlserver.jar/msbase.jar/msutil.jar。但是到了sql server 2005/2008就方便很多,只需要一个包就可以搞定,sqljdbc.jar或者sqljdbc4.jar。具体的可以看看microsoft的官网上对jdbc驱动的说法。这两个包的选择也很多特点,如果项目必须在JDK 1.6 上运行,即使该应用程序不使用 JDBC 4.0 功能,也应使用 sqljdbc4.jar。
jdbc 4.0 for sql server下载地址:http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=11774
在完成搭建项目框架的过程中,也遇到过很多问题。
异常一:java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver
这是由于更换了jdbc的jar包,新的jar中没有com.microsoft.jdbc.sqlserver.SQLServerDriver,所以必须换成sql server 2008相应的dviver。之前使用的SQL Server 2000 JDBC driver是:"com.microsoft.jdbc.sqlserver.SQLServerDriver",而SQL Server 2005 and 2008 JDBC driver必须使用:"com.microsoft.sqlserver.jdbc.SQLServerDriver"。同时,URL前缀也有相应的改变,SQL Server 2000之前使用"jdbc:microsoft:sqlserver://",SQL Server 2005 and 2008使用“jdbc:sqlserver://"。而且自Microsoft SQL Server JDBC Driver 1.2后支持使用数据库实例名进行连接,如:jdbc:sqlserver://[serverName[/instanceName][:portNumber]][;property=value[;property=value]]。
综上所述,使用jdbc连接sql server 2005和2008,必须做一下处理:
Driver更换成:com.microsoft.sqlserver.jdbc.SQLServerDriver
url前缀更换成:jdbc:sqlserver://
异常二:此驱动程序不支持 Java Runtime Environment (JRE) 1.7 版。请使用支持 JDBC 4.0 的 sqljdbc4.jar 类库。
这个花费了我很多时间去尝试,第一次遇到是使用tomcat服务器,修正之后又换成jboss服务器,也就是第二次,这两次都遇到了这个问题。当第一次遇到这个问题之后,我上网查了很多资料,我也照着这些资料上的处理方法处理了,但是没有比较好的效果。首先是因为使用jdbc连接sql server 2008,必须换用新的jar包,所以在microsoft的官网上下载了jdbc 4.0 for sql server。在下载下来的压缩包中,可以找到sqljdbc.jar或者sqljdbc4.jar,我先将这两个jar包都放在了项目的classpath中,运行出现这个异常。根据资料的说明,将sqljdbc.jar从classpath中删除,但是异常依然存在。然后又按照资料的说法将sqljdbc4.jar放到了jdk目录中,目录路径为jdk/jre/lib/ext,这次使用tomcat发布应用,应用成功的运行了。但是我将项目发给同事,让他试试,结果他将jar包放到classpath中就可以了,不必将jar包放到jdk中。
第二次出现此异常,上述运行成功的项目应用使用jboss来发布,结果又出现了此异常。这次我将jar包放入jboss的lib中,依旧有此异常。之后我查看发布到jboss中的项目,发现在项目的WEB-INF/lib中存在sqljdbc.jar,应该是之前将此jar包从classpath中删除,但是没有从lib包中删除,所以再次将sqljdbc.jar从lib文件目录中删除,再次运行项目,项目可以成功运行。不用将jar包放入tomcat和jboss的目录中,也不用放入jdk目录中,也跟jar的顺序无关。
异常三:java.lang.IllegalArgumentException: URI scheme is not “file”?
这个异常是由这两句代码引起的。
URL url = QueryParser.class.getResource(Querys.QUERY_FILE_PATH);
InputStream in = new FileInputStream(new File(url.toURI())); 可以理解为对于使用getgetResource方法获得文件url,两种服务器对url的前缀做出了不同的处理。
url的前缀模式不止一种,比如file//和http://。对于new File(url.toURI())这条语句,url的前缀必须是file//,所以对于语句new File(new URI("file:///etc/passwd"))能运行,而对于语句new File(new URI("http://localhost/etc/passwd"))则不能运行。因此,我们不能始终认为url的前缀是file//,对于new File(url.toURI())的运用也要特别注意。如果使用InputStream is = url.openStream();就不会出现异常。
附录:
配置hibernatge方言(Hibernate Dialect):
参考hibernate官网上的配置,可以看到一些列数据库以及其相应的方言,sql server 2008的hibernate方言是org.hibernate.dialect.SQLServer2008Dialect。
Database | Dialect Property |
---|---|
DB2 | org.hibernate.dialect.DB2Dialect |
HSQLDB | org.hibernate.dialect.HSQLDialect |
HypersonicSQL | org.hibernate.dialect.HSQLDialect |
Informix | org.hibernate.dialect.InformixDialect |
Ingres | org.hibernate.dialect.IngresDialect |
Interbase | org.hibernate.dialect.InterbaseDialect |
Microsoft SQL Server 2000 | org.hibernate.dialect.SQLServerDialect |
Microsoft SQL Server 2005 | org.hibernate.dialect.SQLServer2005Dialect |
Microsoft SQL Server 2008 | org.hibernate.dialect.SQLServer2008Dialect |
MySQL | org.hibernate.dialect.MySQLDialect |
Oracle (any version) | org.hibernate.dialect.OracleDialect |
Oracle 11g | org.hibernate.dialect.Oracle10gDialect |
Oracle 10g | org.hibernate.dialect.Oracle10gDialect |
Oracle 9i | org.hibernate.dialect.Oracle9iDialect |
PostgreSQL | org.hibernate.dialect.PostgreSQLDialect |
Progress | org.hibernate.dialect.ProgressDialect |
SAP DB | org.hibernate.dialect.SAPDBDialect |
Sybase | org.hibernate.dialect.SybaseDialect |
Sybase Anywhere | org.hibernate.dialect.SybaseAnywhereDialect |
参考资料:
1. http://msdn.microsoft.com/en-us/library/aa342325.aspx
2. http://www.tutorialspoint.com/hibernate/hibernate_configuration.htm