Tag: jdbc

让Hibernate和SQL Server与VARCHAR和NVARCHAR一起玩得很好

我目前正在大型数据库的某些表中启用UTF-8字符。 这些表已经是MS-SQL类型的NVARCHAR。 另外,我还有几个使用VARCHAR的字段。 Hibernate与JDBC驱动程序的交互存在一个众所周知的问题(参见例如, 在hibernate中映射到varchar和nvarchar )。 简而言之,无论基础SQL类型如何,Hibernate / JDBC都会生成将所有字符串作为Unicode传递的SQL。 当数据库中的非unicode(varchar)字段与Unicode输入字符串进行比较时,该列的指示与编码不匹配,因此执行全表扫描。 在JDBC驱动程序(JTDS和MS版本)中,有一个参数可以将Unicode字符串作为ASCII传递,但这是一个全有或全无的命题,它不允许将国际字符输入到数据库中。 我在这个问题上看到的大多数post都提出了两个解决方案中的一个 – 1)将数据库中的所有内容更改为NVARCHAR或2)设置sendStringParametersAsUnicode = false,我的问题是这个 – 是否有任何已知的解决方案来使用VARCHAR和NVARCHAR一起玩得很好? 由于下游依赖性和其他外部问题,我的环境将一切都更改为NVARCHAR是一个巨大的问题。

java – 独立应用程序的DataSource – 没有应用程序服务器

我想从独立的应用程序连接到MySQL数据库。 没有应用程序/ Web服务器。 此页面建议我应该使用DriverManager来创建连接。 但是, 此页面表明无法合并从DriverManager创建的连接。 但是连接池对我来说是必须的,因为应用程序使用各种线程同时写入数据库,因此关闭/重新创建连接不是最佳选择。 我应该为此目的使用哪种DataSource实现? 我查看了MysqlConnectionPoolDataSource,但我不确定它是否实际实现了连接池。 我还查看了Tomcat DataSource ,我确信它实现了一个连接池,但我不确定它是否可以在Tomcat之外使用。 当我关闭独立应用程序时,我该怎么做才能正确释放连接/池? 编辑:看起来Tomcat DataSource 可以从独立应用程序中使用,所以我将使用它。 它还有一个close方法,我假设它将释放连接。

与Oracle DB连接时,网络适配器无法建立连接

尝试通过JDBC连接远程Oracle数据库时,我收到以下exception: java.sql.SQLRecoverableException: IO-fout: The Network Adapter could not establish the connection at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:419) at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:536) at oracle.jdbc.driver.T4CConnection.(T4CConnection.java:228) at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521) at java.sql.DriverManager.getConnection(DriverManager.java:322) at java.sql.DriverManager.getConnection(DriverManager.java:358) 以下是我的设置: Database: Oracle 10g Release 2 Standard Edition JDBC library: ojdbc6.jar JDBC driver: oracle.jdbc.driver.OracleDriver JDBC URL: jdbc:oracle:thin:@9.2.2.2:1521:ORCL where ORCL is database’s SID JDBC User/pwd: Correct username / password 关于这个问题的奇怪之处在于,当我在工作时,连接工作正常。 当我尝试通过AT&T […]

驱动程序类如何位于JDBC4中

JDBC版本4中的一个重要补充您不必再通过调用Class.forName显式加载驱动程序。 当您的应用程序第一次尝试连接数据库时, DriverManager自动加载应用程序CLASSPATH的驱动程序。 我的问题是怎么样? 如果类路径中有多个驱动程序怎么办? 我可以猜到的一件事是,在解析连接URL时,是否需要驱动程序是JDBC或ODBC,但是如何从多个jdbc兼容的驱动程序中说出哪一个将被选择用于我正在使用的数据库? (假设我使用的是MySql,我需要MySql-Connector驱动程序)。 在JVM中是否存在此类数据库驱动程序的静态映射?

如何从任意位置使用JDBC驱动程序

我需要测试与数据库的JDBC连接。 执行此操作的Java代码应该如下所示: DriverManager.getConnection(“jdbc connection URL”, “username”, “password”); 驱动程序管理器将查找给定连接URL的相应​​驱动程序。 但是我需要能够在运行时加载JDBC驱动程序(jar)。 即我在运行上述代码片段的java应用程序的类路径上没有JDBC驱动程序。 所以我可以使用这段代码加载驱动程序,例如: URLClassLoader classLoader = new URLClassLoader(new URL[]{“jar URL”}, this.getClass().getClassLoader()); Driver driver = (Driver) Class.forName(“jdbc driver class name”, true, classLoader).newInstance(); 但是后来驱动程序管理器仍然不会提起它,因为我无法告诉它使用哪个类加载器。 我尝试设置当前线程的上下文类加载器,它仍然无法正常工作。 任何人都有最好的方法来实现这一目标吗?

JNDI路径Tomcat与Jboss

我有DataSource,它在context.xml中的T​​omcat 6上配置为MyDataSource。 而我是通过以下方式获取它: DataSource dataSource; try { dataSource = (DataSource) new InitialContext().lookup(“java:comp/env/MyDataSource”); } catch (NamingException e) { throw new DaoConfigurationException( “DataSource ‘” + url + “‘ is missing in JNDI.”, e); } 一切正常。 现在我将此代码导出到Jboss AP 6.我将dataSource及其连接池配置为local-tx dataSource,名称相同。 当我执行上面的代码时,我得到NamingExceptionexception。 经过一番调查,我发现在Jboss下调用我的DataSource的正确方法是 dataSource = (DataSource) new InitialContext().lookup(“java:/MyDataSource”); 任何人都可以解释一下我为什么要在Jboss下的JNDI路径中省略“comp / env”?

Oracle在Java中的RETURNING INTO使用(JDBC,Prepared Statement)

我正在使用JDBC来执行如下所示的Oracle语句: “INSERT INTO MYTABLE(MYDATA) VALUES(?) RETURNING MY_CALCULATED_DATA INTO ?” // MYTABLE’s def makes MY_CALCULATED_DATA be auto-generated by DB on insert 我找到了几种在Java中调用上述语句的方法,主要是: 使用OraclePreparedStatement: ps = (OraclePreparedStatement)conn.prepareStatement(sql); ps.setString(1, “myvalue”); ps.registerReturnParameter(2, Types.VARCHAR); ps.execute(); rs = ps.getReturnResultSet(); rs.next(); System.out.print(rs.getString(1)); 使用CallableStatement: cs = conn.prepareCall(sql); cs.setString(1, “myvalue”); cs.registerOutParameter(2, Types.VARCHAR); cs.execute(); System.out.print(cs.getString(1)); 问题: 方法#2抛出“SQLException:并非所有返回参数都已注册” , 但是 ,如果我将SQL语句包装成“ BEGIN..END; ” – 则方法#2工作正常。 为什么方法#1在没有“ […]

如何将表值参数从java传递到sql server存储过程?

我有一个具有以下属性的Student类: Name, Department, Address, Grade. 现在我有一个ArrayList ,其中包含一些像这样的Student对象, List stuList = new ArrayList(); stuList.add(new Student(“Tom”,”Comp”, “123 street”, “A”)); stuList.add(new Student(“Jery”,”Comp”, “456 street”, “A+”)); stuList.add(new Student(“Mac”,”Maths”, “Dum Street”, “B”)); 我需要将此arraylist传递给sql server存储过程并将student对象数据插入表中。 如何在Java中实现这一目标? 我需要有一个存储过程。 Java版本8,Sql Server 2014如果有任何用处。

通过JDBC从Linux机器通过Windows身份validation连接到SQL Server

我希望能够使用jdbc和Windows身份validation连接到SQL Server。 我在互联网上看到一些答案,说我应该将以下属性添加到连接字符串: integratedSecurity=true; 并补充说 sqljdbc_auth.dll 到java路径。 但据我所知,只有在我从Windows机器上连接时才适用。 当我在Linux机器上尝试这个时,我得到: java.sql.SQLException: This driver is not configured for integrated authentication 我的问题是我如何从Linux机器上做到这一点。 谢谢

加载JDBC驱动程序

我被告知加载JDBC驱动程序的首选方法是: Class.forName(driverName); 我知道这对于从XML配置文件或用户输入读取的多个驱动程序之间的动态决策更好。 我很好奇的是,如何调用此语句将指定的驱动程序加载到我们甚至没有将结果“类”对象存储在任何地方的环境中。 JavaDocs条目说: public static Class forName(String className) throws ClassNotFoundExceptionReturns 返回与具有给定字符串名称的类或接口关联的Class对象 在这种情况下,Java开发人员如何仅通过此语句设法促进驱动程序对象的存在?