Tag: jdbc

在multithreading环境中处理事务

需要使用多个线程在数据库中插入数据,但即使单个线程无法提交,也必须回滚所有事务。请通过以下方法解决此问题。 在线程之间共享连接对象,并使用join()等待子线程完成,但这看起来像糟糕的设计,因为我在线程之间共享连接对象。 有人可以建议更好的设计来解决这个问题(不确定我是否应该选择分布式txn管理器)?

准备好的声明和声明/查询缓存

我试图理解语句缓存在参数化预准备语句的情况下是否有用。 据我所知 如果我使用缓存,那么查询将根据其“字符串”进行缓存。 在这种情况下,如果查询具有不同的参数值,则它是一个不同的/新的语句/字符串wrt缓存。 此外,当参数更改时,结果也会发生变化。 由于准备好的语句是参数化的,因此在这种情况下使用缓存真的很有用。 我正在使用JDBC / Snaq DB Pool / MySQL数据库。 语句缓存在这里涉及两种不同的情况: JAVA:Snaq DB池提供了ConnectionCache类,它有助于缓存语句。 MySQL:DB还提供了缓存查询和结果的方法。 http://dev.mysql.com/doc/refman/5.1/en/query-cache.html 我的困惑很简单: 如果我要在缓存中搜索查询/对应结果,我将根据字符串比较进行搜索。 如果参数值发生变化,查询字符串也会发生变化。 这将导致具有不同参数值的相同查询的高速缓存中的不同条目。 希望我澄清一下我的问题。

Java ETL过程

我有一个新的挑战是从Oracle数据库加载~100M行并将它们插入远程MySQL数据库服务器。 我把问题分成两部分: 服务器端REST服务器,负责将数据加载到MySQL服务器; 负责加载Oracle数据源的客户端Java应用程序。 在Java方面,我使用普通的JDBC来加载分页内容并通过网络将其传输到服务器。 这种方法效果很好,但是由于我使用Oracle的ROWNUM ….. WHERE ROWNUM> x和ROWNUM <y进行分页,因此代码繁琐而且不具有很大的可扩展性。 我现在尝试了Hibernate的StatelessSession,我的实体通过Annotations映射。 代码更具可读性和清晰性,但性能更差。 我听说过ETL工具和SpringBatch,但我对它们并不了解。 还有其他方法可以解决这个问题吗? 提前致谢。 UPDATE 感谢您提供宝贵的建议。 我选择使用SpringBatch从Oracle数据库加载数据,因为环境非常紧张,我无法访问Oracle的工具集。 SpringBatch是真实的。 对于数据写入步骤,我选择使用MySQL的LOAD DATA INFILE编写大量的记录。 REST服务位于中间,因为出于安全原因它们彼此隐藏。

调用getNextException以查看原因:如何使Hibernate / JPA显示数据库服务器消息以查找exception

我正在使用Postgresql,Hibernate和JPA。 每当数据库中出现exception时,我都会得到类似这样的东西,因为它没有显示DB服务器上真正出错的地方。 Caused by: java.sql.BatchUpdateException: Batch entry 0 update foo set ALERT_FLAG=’3′ was aborted. Call getNextException to see the cause. at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2621) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1837) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2754) at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) … 82 more 我希望数据库中的exception消息出现在应用程序的日志中。 我遇到过这篇文章 ,它使用一个Aspect来填充exception链,否则在SQLExceptions的情况下,该exception链没有正确填充。 有没有办法解决这个问题,而无需使用Aspects或任何自定义代码。 理想的解决方案只涉及配置文件更改。

使用JDBC 3.0实现对嵌套事务的支持

我们的遗留应用程序使用JDBC 3.0。 它通过实现自己的事务管理器来支持事务,该事务管理器能够为每个线程返回相同的JDBC连接。 我最近发现的问题是它不支持嵌套事务:如果事务是在另一个事务中启动的,那么在内部事务的上下文中运行的每个SQL都将使用相同的数据库连接执行,并且当它被提交或者回滚它会自动提交或回滚从外部事务开始的所有更改。 据我所知,我可以使用JDBC 3.0保存点实现对嵌套事务的支持:每当启动嵌套事务时,我都可以为当前连接设置新的保存点。 之后,如果嵌套事务被回滚,我将回滚到此保存点。 另一方面,如果它被提交,我将什么都不做。 只有最外部事务的提交才会将更改保存到db。 它是否正确? 这种方法有什么缺陷吗? 如果是的话,我的可能性是什么? 谢谢。

Java中JTable的JDBC TableModel?

我想将数据库表显示为JTable。 我之前从未使用过JTable,所以我用Google搜索了JTable和TableModel。 通过谷歌搜索,我能够编写自己的自定义TableModel,显示存储的数据 Object[][] data; 现在,我想将我的数据库表数据显示到JTable中。 我也搜索了一下并且已经了解了这一点,但仍然对在AbstractTableModel的实现类中应该去哪里感到困惑。 以下是自定义TableModel的代码。 public abstract class AbstractPOLDATTableModel extends AbstractTableModel { protected boolean DEBUG = false; private String[] columnNames; private Object[][] data; protected AbstractPOLDATTableModel(String[] columnNames, Object[][] data) { this.columnNames = columnNames; this.data = data; } public int getColumnCount() { return columnNames.length; } public int getRowCount() { return data.length; } @Override public […]

Java MySQL更新查询

我收到错误“无法发布数据”。 这是SSCCE //package mysqltest; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.applet.Applet; import java.awt.TextArea.*; import java.sql.*; import java.util.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.*; import java.net.*; import java.applet.*; public class test extends JApplet { public JTextArea c; public void init() { c = new JTextArea(); add(c); c.append(“Looking for database…”); Connection conn = null; Properties props = new […]

java从XML文件读取JDBC连接

任何人都知道如何编写XMl文件,我将在其中连接JDBC(用户名,密码,驱动程序,连接),然后读取该xml以连接到db?

无法通过JDBC连接到远程HANA数据库

我正在从我的笔记本电脑上运行一个小型JAVA程序,尝试通过JDBC连接到我们的HANA服务器,以获得“我们可以吗?” 原型。 我知道可以通过JDBC连接连接到远程HANA服务器。 但是,我不能。 这是我使用sapdbc.jar文件从JAVA使用的方法。 我只是在这里测试连接。 DataSourceSapDB ds = new DataSourceSapDB(); ds.setServerName(“10.xxxxx”); ds.setPort(30015); ds.setDatabaseName(“dbNAME”); ds.setUser(“myUser”); ds.setPassword(“myPassword”); Connection c = ds.getConnection(); if (c == null) return; 实例为00,但如果需要,则不会在连接字符串中看到将其包含在何处。 我仔细检查了所有的属性。 我们的HANA服务器由另一家公司托管,但访问它是在我们的网络内。 这可能是个原因吗? 谢谢你的任何帮助。 我得到的连接错误是: com.sap.dbtech.jdbc.exceptions.JDBCDriverException: SAP DBTech JDBC: Cannot connect to jdbc:sapdb://10.xxxxxx:30015/dbNAME [Connect reply receive failed [Connection reset].]. at com.sap.dbtech.jdbc.DriverSapDB.connect(DriverSapDB.java:178) at com.sap.dbtech.jdbcext.DataSourceSapDBBase.openPhysicalConnection(DataSourceSapDBBase.java:374) at com.sap.dbtech.jdbcext.DataSourceSapDB.getConnection(DataSourceSapDB.java:49) at com.glazers.hana.utils.HanaStoredProcedure.execute(HanaStoredProcedure.java:37) at com.glazers.hana.utils.HanaStoredProcedure.main(HanaStoredProcedure.java:24)

从RestulSet表编辑JTable

继续这个问题。 我的问题是我无法编辑我的JTable。 我得到一个exception和Object值而不是我应该看到的。 我正在使用带有MS-Access数据库的ResultSet表代码并进行一些修改。 我的代码可以在这里找到。 我调用rs.updateRow()时rs.updateRow()错误。 java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]Error in row 。 我使用updateRow()对这个错误进行了谷歌搜索,并没有多少提出来。 我看到的唯一真正的答案是使用预备语句,但我不是SQL命令的专家。 如果你能告诉我使其成为GlazedList的最佳方法,那么我也可以轻松过滤。 除非你能为我提供一些可以轻松过滤常规JTable的东西。