我正在将Web应用程序(WAR)部署到Tomcat 8 Web容器.
WAR在'/ WEB-INF/lib'目录中包含以下jTDS JDBC驱动程序:
<dependency org="net.sourceforge.jtds" name="jtds" rev="1.3.1" />
Run Code Online (Sandbox Code Playgroud)
(文件是:) jtds-1.3.1.jar.
这是资源的定义方式META-INF/context.xml:
<Resource name="jdbc/jtds/sybase/somedb"
auth="Container"
type="javax.sql.DataSource"
driverClassName="net.sourceforge.jtds.jdbc.Driver"
url="jdbc:jtds:sybase://localhost:2501/somedb"
username="someuser" password="somepassword"
/>
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我以正常方式获取javax.sql.DataSource:
InitialContext cxt = new InitialContext();
if ( cxt == null ) {
throw new RuntimeException("Uh oh -- no context!");
}
DataSource ds = (DataSource) cxt.lookup( lookupName );
Run Code Online (Sandbox Code Playgroud)
我进一步验证(通过打印)DataSource对象ds是期望的类型:
org.apache.tomcat.dbcp.dbcp2.BasicDataSource
Run Code Online (Sandbox Code Playgroud)
...但是当我尝试从中获取连接时:
Connection conn = ds.getConnection();
Run Code Online (Sandbox Code Playgroud)
......我得到以下描述:
java.lang.AbstractMethodError
net.sourceforge.jtds.jdbc.JtdsConnection.isValid(JtdsConnection.java:2833)
org.apache.tomcat.dbcp.dbcp2.DelegatingConnection.isValid(DelegatingConnection.java:924)
org.apache.tomcat.dbcp.dbcp2.PoolableConnection.validate(PoolableConnection.java:282)
org.apache.tomcat.dbcp.dbcp2.PoolableConnectionFactory.validateConnection(PoolableConnectionFactory.java:359)
org.apache.tomcat.dbcp.dbcp2.BasicDataSource.validateConnectionFactory(BasicDataSource.java:2316)
org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2299)
org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2043)
org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1543)
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?
我有一个情况.我有一个几乎准备好发布(在2个月内发布)的应用程序,它在microsoft Sql-Server数据库上运行查询.我们使用sql-server的标准Microsoft jdbc驱动程序实现.效果很好,没问题.
现在有一个开发人员给我说我应该将我们的默认jdbc实现切换到JTDS驱动程序实现.
我在网上读了一些关于驱动程序及其基准测试的信息等等,而且看起来微软的驱动程序看起来好一点.
但考虑到发布很快,驱动程序是开源和所有其他我现在都没有想到的东西,你会投入时间来进行切换吗?
我正在使用Java 1.6,JTDS 1.2.2(也只是尝试1.2.4无效)和SQL Server 2005来创建CallableStatement来运行存储过程(没有参数).我看到运行相同存储过程的Java包装器比使用SQL Server Management Studio慢30%.我运行MS SQL分析器,两个进程之间的I/O差别不大,所以我认为它与查询计划缓存无关.
存储的proc不带参数,也不返回任何数据.它使用服务器端游标来计算填充表所需的值.
我无法看到从Java调用存储过程如何增加30%的开销,当然它只是数据库的一个管道,SQL被发送下来然后数据库执行它....数据库是否可以提供Java应用不同的查询计划?
我已经发布了MSDN论坛和sourceforge JTDS论坛(主题:"在JTDS中存储过程比在DB中更直接")我想知道是否有人有任何关于为什么会发生这种情况的建议?
提前致谢,
-詹姆士
(NB不要害怕,一旦找到解决方案,我会在这里整理其他论坛中的任何答案)
Java代码片段:
sLogger.info("Preparing call...");
stmt = mCon.prepareCall("SP_WB200_POPULATE_TABLE_limited_rows");
sLogger.info("Call prepared. Executing procedure...");
stmt.executeQuery();
sLogger.info("Procedure complete.");
Run Code Online (Sandbox Code Playgroud)
我运行了sql profiler,发现了以下内容:
Java app:CPU:466,514阅读次数:142,478,387撰写:284,078期限:983,796
SSMS:CPU:466,973阅读次数:142,440,401写作:280,244持续时间:769,851
(两个DBCC DROPCLEANBUFFERS在分析之前运行,并且都产生正确的行数)
所以我的结论是他们都执行相同的读写操作,只是他们这样做的方式不同,你们怎么想?
事实证明,查询计划对于不同的客户端是显着不同的(Java客户端在插入期间更新索引不在更快的SQL客户端中,同样,它执行连接的方式也不同(嵌套循环Vs.收集流,嵌套循环Vs索引扫描,唉!)).这就是为什么,我还不知道(当我到底时,我会重新发帖)
结语
我无法让它正常工作.我试图均质连接属性(arithabort,ansi_nulls在Java和管理工作室客户端之间等).它最终导致两个不同的客户端具有非常相似的查询/执行计划(但仍然具有不同的实际plan_ids).我发布了我在MSDN SQL Server论坛上发现的摘要,因为我发现不仅在JDBC客户端和管理工作室之间,而且在Microsoft自己的命令行客户端SQLCMD之间有不同的性能,我还检查了一些更激进的事情,如网络流量也可以将存储的proc包装在另一个存储过程中,只是为了咧嘴笑.
我有一种感觉问题出在游标执行方式的某个地方,并且它以某种方式导致Java进程被暂停,但是为什么不同的客户端应该在没有其他运行时产生这种不同的锁定/等待行为并且运行相同的执行计划有点超出我的技能(我不是DBA!).
结果,我已经决定用4天的时间浪费在这样的事情上,所以我会勉强编写代码(如果我诚实的话,存储过程需要重新编码才能更多增量而不是重新编写代码. - 无论如何,每周计算所有数据),然后用白垩来体验.我会把这个问题保持开放,非常感谢所有把帽子戴在戒指上的人,这一切都很有用,如果有人想出更进一步的话,我很想听到更多的选择......如果有人发现的话这篇文章是因为在他们自己的环境中看到这种行为,所以希望这里有一些你可以自己尝试的指针,希望能比我们更充分地看到.
我现在已经准备好了周末!
-詹姆士
我需要一个Java函数,它返回SQL SELECT查询的结果,作为InputStream通过网络发送结果的另一个系统的参数.
但是,InputStream必须String使用自定义分隔符(即通常但不总是CSV).
虽然我可以轻松创建一个函数来检索结果,创建一个分隔符String,最后将其转换String为一个InputStream,但SQL结果通常会太大而无法在内存中处理.此外,在返回结果之前处理整个结果集将导致不必要的等待时间.
如何返回一个InputStream迭代SQL结果并发送从数据库返回的已处理(分隔)数据?
我必须为支持租户的Web应用程序支持多种数据库类型.其中,我已成功支持Microsoft的SQL Server,使用net.sourceforge.jtds.jdbc.Driver类和连接字符串,如"jdbc:jtds:sqlserver://192.168.1.189:1433/ApplicationName".这有效,但它要求用户在SQL Server实例中明确定义用户并启用SQL Server身份验证.
现在,不可避免地,需求发生了变化,我们应该支持通过Windows身份验证连接到SQL Server.显然,这需要对连接字符串进行某种更改,因为数据库服务器必须能够以某种方式区分传递到数据库连接的凭据是用于在SQL Server安装中还是在Windows操作系统中定义的用户.但它是什么?
根据互联网的建议,如果进展到扩展连接字符串;useNTLMv2=true;domain=WORKGROUP.这似乎使数据库服务器意识到我想要作为Windows用户进行身份验证,但实际的登录失败了
The login is from an untrusted domain and cannot be used with Windows authentication. (code 18452, state 28000)
Run Code Online (Sandbox Code Playgroud)
现在我的测试设置,J2EE应用程序和SQL服务器实例实际上都在同一台机器上(虽然在生产中它们可能不是),而且这台计算机还不足以登录自己?显然我在这里错过了很大一部分难题.为了说服SQL Server实例启动它的用户实际上可以通过JDBC登录它,必须做些什么呢?
编辑
由于我们已经尝试将我们的Web应用程序与完整的Microsoft基础架构堆栈(SQL Server,Active Directory,域名服务...)集成太多不成功,我必须限制此问题:
有没有人知道通过JDBC形式的J2EE应用程序使用定义为"Windows用户"的用户帐户访问SQL Server安装的方法,而不必使用Active Directory,运行Web应用程序的Windows机器和专有DLL?赏金是针对该子问题的任何解决方案.整个问题显然过于宽泛,无法在一篇论坛帖子中得到解答.
下面的代码在变量上生成一个错误,上面con2写着 "non-static variable con2 cannot be referenced from a static context Error."我用Google搜索解决方案,并且他们建议变量未初始化以使方法可用.我错误地初始化了吗?我也尝试过把事情公之于众,但这也无济于事.
import java.io.*;
import java.net.*;
import java.sql.*;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
import net.sourceforge.jtds.jdbcx.JtdsDataSource;
import net.sourceforge.jtds.jdbc.Driver;
class testconnect {
private java.sql.Connection con2 = null;
private final String url2 = "jdbc:jtds:sqlserver://";
private final String serverName= "SQL01";
private final String portNumber = "2677";
private final String databaseName= "App";
private final String userName = "bob";
private final String password = "boob";
private final String selectMethod = "cursor";
private …Run Code Online (Sandbox Code Playgroud) 我试图使用JTDS驱动程序从我的应用程序使用Windows身份验证连接Sql Server数据库,但我得到以下错误
SSO失败:未加载本机SSPI库.检查java.library.path系统属性.
以下是我试图解决的情况,但仍然缺少某些东西..
我很困惑为什么这不适用于Sql Server 2008 R2和Denali.
我在MS SQL Server上有一个表,其中一列的数据类型为日期.我正在使用jtds.jar与DB进行JDBC连接.我从Connection获取DatabaseMetaData.在检查DatabaseMetaData中的列时,我发现了这一点
int iType = rsMeta.getInt("DATA_TYPE");
Run Code Online (Sandbox Code Playgroud)
返回列类型,java.sql.Types.VARCHAR它是一个字符串而不是日期.但它也会回归
String tmp = rsMeta.getString("TYPE_NAME");
Run Code Online (Sandbox Code Playgroud)
键入名称作为日期.
但对于Oracle,它返回date数据类型java.sql.Types.DATE.
为什么会有这样的差异?
情况
我有一个(Tomcat)Java Web应用程序,使用jTDS连接到MSSQL 2008数据库.此Java应用程序使用用户输入执行99%的MSSQL存储过程.
问题
jTDS驱动程序有时会(在应用程序的不同位置)回复错误:
超出最大存储过程,函数,触发器或视图嵌套级别(限制32).
我们可以通过添加prepareSQL=0到jTDS连接字符串来避免这种情况.然后错误随处可见,但是除了所有其他值之外prepareSQL,错误仍然存在.我不知道jTDS添加了多少存储过程嵌套级别,但显然它对我们的应用来说太多了.
问题
只使用存储过程来执行,当然在Java代码中使用Prepared Statements,对我们有多大的影响prepareSQL=3(或prepareSQL=0)?换句话说:在每个网站上我都会发现人们说"从不prepareSQL=0在生产环境中使用",那是否也适用于这种情况?
如果prepareSQL=0不是推荐的解决方案,安全问题等,我们应该寻找另一个驱动程序.jTDS在过去的两年里没有更新,微软有一个JDBC 4.0的驱动程序.我找不到jTDS和微软的JDBC 4.0驱动程序之间的任何基准或比较.使用Microsoft的2.0和3.0驱动程序,一般意见似乎是jTDS更快,更好,更高效.JDBC 4.0仍然如此,或者微软是否通过了它的竞争对手?
我有一个Java Hibernate项目配置,它与SQL Server 2008 R2一起使用,现在有了新的OS 8.1(从7开始)和SQL Server 2012(express),我无法连接到SQL服务器.
因为它适用于2008 R2 ,所以/应该在语法上正确的相关配置:
datasource.properties
jdbc.driverClassName=net.sourceforge.jtds.jdbc.Driver
jdbc.url=jdbc:jtds:sqlserver://localhost:1433/dbname;instance=SQLEXPRESS
jdbc.username=auser
jdbc.password=xyz
Run Code Online (Sandbox Code Playgroud)
我试过org.hibernate.dialect.SQLServerDialect在2008 R2工作的两种方言.
hibernate.hbm2ddl.auto=create-drop
hibernate.dialect=org.hibernate.dialect.SQLServerDialect
#hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect
hibernate.show_sql=true
Run Code Online (Sandbox Code Playgroud)
springConfiguration.xml
<bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
Run Code Online (Sandbox Code Playgroud)
SQL Server 2012安装了混合模式身份验证,SQL Server Management Studio连接没有问题(有或没有实例名称).
我已经更新了SQL Server Network Configurationfor SQLEXPRESS.
SQLEXPRESS的协议:
TCP/IP Enabled
以及TCP/IP Properties - TCP Port到1433年的所有.
我试过禁用Windows防火墙只是为了测试它是否在路上,但它会导致相同的错误.
我最终添加了防火墙规则,并按照这个优秀的配置SQL Express 2012中的一些步骤来接受远程连接文章. …