Tag: jdbc

如何从Oracle JDBC PreparedStatement对象获取绑定参数的值

我想在使用Oracle JDBC时使用实际绑定参数实现所有已执行语句的日志记录。 我希望我可以创建这样的日志记录方法,只传递PreparedStatement对象作为参数。 例如,我创建了PreparedStatement并绑定了一个参数 PreparedStatement ps = conn.prepareStatement( “SELECT * FROM employees WHERE employee_id = ?”); ps.setInt(1,1); 现在我希望能够从ps获得我可以放在日志文件中的实际SQL语句“SELECT * FROM employees WHERE employe_id = 1”。 到目前为止,我发现我可以使用 ((oracle.jdbc.driver.OracleStatement) ps).getOriginalSql() 要得到 SELECT * FROM employees WHERE employe_id = ? 现在我需要一些方法来从ps获取当前绑定变量的列表,以便我可以替换? 使用绑定参数值。 我试着查看ps.getClass()。getDeclaredFields()和ps.getClass()。getSuperclass()。getDeclaredFields()但到目前为止找不到存储绑定参数值及其类型的位置。 有什么建议在哪找?

Spring Framework JDBC DAO具有agrgegation / composition

我有一个应用程序已经使用Spring Framework和Spring JDBC使用SimpleJdbcTemplate和RowMapper类的DAO层。 这似乎与从数据库中读取的小类结构非常有效。 但是,我们需要加载包含其他对象集合的对象,这些对象仍然保存其他对象的集合。 这个问题的“显而易见的”解决方案是创建一个命名的RowMapper类或我们的对象,并将引用传递给构造函数中的正确DAO对象。 例如: public class ProjectRowMapper implements ParameterizedRowMapper { public ProjectRowMapper(AccountDAO accountDAO, ) { this.accountDAO = accountDAO; } public Project mapRow(ResultSet rs, int rowNum) throws SQLException { Project project= new Project (); project.setProjecttId( rs.getString(“project_id”) ); project.setStartDate( rs.getDate(“start_date”) ); // project.setEtcetera(…); // this is where the problems start project.setAccounts( accountDAO.getAccountsOnProject(project.getProjectId()) ); } […]

multithreading数据库读取

在我们的Java应用程序中,我需要从oracle数据库中读取大约8000万条记录。 我正在尝试为此重新设计multithreading程序。 目前,我们正在使用Java 5线程池,其中10个线程基于主键模式并行读取数据库。 每个线程将读取不同的模式,如001 *和002 *。 如何提高该程序的性能? 我正在考虑设计模式,有主线程来读取数据库并将处理委托给子线程。 在我们现有的设计中,不同的线程通过10个jdbc连接来访问表。 使用新方法,我将只有一个线程读取表格。 我们为每个线程都有不同的select语句,例如count(*) from “+table+ ” where id like ‘”+format + “%'” select count(*) from “+table+ ” where id like ‘”+format + “%'” 。 Ok听起来读取rowid模式很好,但是通过rowid或rownum阅读是否很好? 任何机构都可以请求新方法的利弊,还有其他方法可以实现它。

JDBC时间戳和日期GMT问题

我有一个JDBC Date列,如果ai使用getDate只是在2009年10月2日获得’ date ‘部分,但是如果我使用getTimestamp我得到完整的’ date ‘ 2009年10月2日13:56:78:890 。 这是我想要的。 但是,getTimestamp返回的’date’会忽略’GMT值,假设日期; 2009年10月2日13:56:78:890 ,我最终获得2009年10月2日15:56:78:890 我的日期在数据库中保存为+ 2GMT日期,但应用程序服务器在GMT上,即落后2小时 怎么还能按照现状,2009年10月2日13:56:78:890 编辑 我在客户端获得了GMT +2上的日期+2

JDBC批处理操作的理解

我在我的应用程序中使用Hibernate ORM和PostgreSQL,有时我使用批处理操作。 起初我不明白为什么在批处理大小为25的日志中,会生成25个查询,并且最初认为它无法正常工作。 但之后我查看了pg驱动程序的源代码,并在PgStatement类中找到以下行: public int[] executeBatch() throws SQLException { this.checkClosed(); this.closeForNextExecution(); if (this.batchStatements != null && !this.batchStatements.isEmpty()) { this.transformQueriesAndParameters(); //confuses next line, because we have array of identical queries Query[] queries = (Query[])this.batchStatements.toArray(new Query[0]); ParameterList[] parameterLists = (ParameterList[])this.batchParameters.toArray(new ParameterList[0]); this.batchStatements.clear(); this.batchParameters.clear(); 并在PgPreparedStatement类中 public void addBatch() throws SQLException { checkClosed(); if (batchStatements == null) { […]

什么时候使用Statement over Prepared Statement?

何时使用语句而不是预处理语句。 我想假设语句用于没有参数的查询,但为什么不使用预准备语句? 对于没有参数的查询,哪一个更快。

如何使用Java和MySQL确定插入或更新是否成功?

我正在使用Java连接到MySQL数据库。 我正在尝试将数据插入或更新到数据库中。 尽管我非常确定插入是成功的,但它返回false。 根据“execute”API,返回值为“如果第一个结果是ResultSet对象,则为true;如果是更新计数,则为false”或“没有结果”。 如何确定插入或更新是否成功? public boolean insertSelections(String selection, String name){ String sql =”INSERT INTO WORKREPORT VALUES (?,?,?,?,?)”; boolean action = false; try { PreparedStatement stmt = conn.prepareStatement(sql); SimpleDateFormat dateFormat = new java.text.SimpleDateFormat(“yyyy:MM:dd hh:mm:ss”); String formatDate = dateFormat.format(new java.util.Date(System.currentTimeMillis())); java.util.Date mDate = dateFormat.parse(formatDate); java.sql.Timestamp timeStamp = new java.sql.Timestamp(System.currentTimeMillis()); // Date time= new Date(mDate.getTime()); stmt.setInt(1, Integer.parseInt(getNumberByName(name).trim())); […]

如何将JDBC mysql驱动程序添加到Eclipse项目中?

我已经下载了mysql-connector-java-5.1.24-bin.jar 我在我的项目中创建了一个lib文件夹并将jar放在那里。 project-> build path->的属性添加JAR并选择上面的JAR。 我仍然得到java.sql.SQLException: No suitable driver found for jdbc:mysql//localhost:3306/mysql 我使用的是mysql 5.5代码: package DBTest; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.sql.*; import java.util.*; /** * Servlet implementation class TenUsers */ @WebServlet(“/TenUsers”) public class TenUsers extends HttpServlet { /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) […]

Postgresql JDBC表值参数

MSSQL有一个很棒的function叫做Table Valued Parameters 。 它允许您将自定义数据表传递给存储过程和函数。 我想知道PostgreSQL中的等价物,如果存在,使用JDBC? 我知道将数组作为函数参数传递的选项,但这似乎仅限于PostgreSQL数据类型。 考虑以下PL / pgSQL代码: CREATE TYPE number_with_time AS( _num float, _date timestamp ); 和这个函数头: CREATE OR REPLACE FUNCTION myfunc(arr number_with_time[]) 任何人都可以使用JDBC驱动程序发布Java代码,使用用户定义数据类型的数组调用该函数吗?

什么是最大JDBC批量大小?

我有一个列表,该列表不断增加。 我正在做依赖于列表大小的批量添加。 我忘了将executeBatch的限制放在指定的大小。 计划工作了几个小时。 我现在不想停下来,修理并重新开始。 我的问题是,决定添加批次的大小是什么? 批处理一次执行executeBatch()的最大容量是多少? 多少次我可以使用addBatch而不执行executeBatch() ?