Я думаю, что вы используете mysql в качестве базы данных, и это известная ошибка.
Позвольте мне подробно остановиться на
Согласно документации Oracle на сайте Java, TYPE_SCROLL_SENSITIVE используется для двух целей:
1. Драйвер Mysql теперь может перемещать указатель набора результатов jdbc туда и сюда (который в противном случае просто идет в прямом направлении), поэтому в основном включена прокрутка {так что теперь вы можете сделать resultset.previous(), и указатель вернется}
2. Чтобы показать обновленные значения (внутренние изменения), внесенные в базу данных.
Вы застряли на 2-м пункте...
Посмотрите, ваша программа не работает, потому что вы никогда не использовали концепцию fetchSize();
всякий раз, когда используется jdbc, драйвер извлекает количество строк по умолчанию в отображаемый кеш (например, oracle загружает 10 строк по умолчанию)
поэтому TYPE_SCROLL_SENSITIVE будет отображать только обновленное значение следующей перезагрузки кеша. это похоже на то, что у вас есть 100 строк в БД, вы обновили все, но до этого были извлечены только 10 строк, поэтому вы получите остальные 90 обновленных строк, распечатанные впоследствии, поскольку драйвер загрузит эти таблицы в 9 раундах управления кешем.
для явного определения количества извлекаемых строк (например, изменение количества строк с 10 до 1 для оракула) вы можете явно определить fetchSize() при создании оператора (но использование кеша неэффективно, в конце замедляет скорость )
поэтому при инициализации оператора как:
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
добавить строку как:
stmt.setFetchSize(1); //1 is the no. of rows that will be fetched.
создать набор результатов как:
ResultSet rset = stmt.executeQuery("select * from persons");
для проверки данных: напечатайте setFetchSize из набора результатов, если он переходит от оператора к набору результатов во время Sysout, тогда конфигурация выборки была сохранена, как:
System.out.println("fetch size: " + resultSet.getFetchSize());
если sysout дает «1» в качестве размера выборки, вы увидите свои динамические обновления из программы как есть, но если он дает «0», это означает, что ваша БД не поддерживает динамическую инициализацию fetchSize();
Вот проблема с mysql, mysql по умолчанию извлекает все количество строк в ResultSet и, следовательно, динамическое внутреннее обновление не извлекает динамические значения. (внутреннее обновление — это обновление, выполненное другим потоком той же программы).
Вот ошибка, подтверждающая мою точку зрения на ошибки sql:
баг ошибки fetchSize
if you use oracle,this java doc copied from oracle documentation will just work fine:
документы orcale TYPE_SCROLL_SENSITIVE пример ResultSet5.java
import java.sql.*;
public class ResultSet5
{
public static void main(String[] args) throws SQLException
{
// Load the Oracle JDBC driver
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
// Connect to the database
// You can put a database name after the @ sign in the connection URL.
Connection conn =
DriverManager.getConnection ("jdbc:oracle:oci8:@", "scott", "tiger");
// Create a Statement
Statement stmt = conn.createStatement (ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
// Set the statement fetch size to 1
stmt.setFetchSize (1);
// Query the EMP table
ResultSet rset = stmt.executeQuery ("select EMPNO, ENAME, SAL from EMP");
// List the result set's type, concurrency type, ..., etc
showProperty (rset);
// List the query result
System.out.println ("List ENO, ENAME and SAL from the EMP table: ");
while (rset.next())
{
System.out.println (rset.getInt(1)+" "+rset.getString(2)+" "+
rset.getInt(3));
}
System.out.println ();
// Do some changes outside the result set
doSomeChanges (conn);
// Place the cursor right before the first row
rset.beforeFirst ();
// List the employee information again
System.out.println ("List ENO, ENAME and SAL again: ");
while (rset.next())
{
// We expect to see the changes made in "doSomeChanges()"
System.out.println (rset.getInt(1)+" "+rset.getString(2)+" "+
rset.getInt(3));
}
// Close the RseultSet
rset.close();
// Close the Statement
stmt.close();
// Cleanup
cleanup(conn);
// Close the connection
conn.close();
}
/**
* Update the EMP table.
*/
public static void doSomeChanges (Connection conn)throws SQLException
{
System.out.println ("Update the employee salary outside the result set\n");
Statement otherStmt = conn.createStatement ();
otherStmt.execute ("update emp set sal = sal + 500");
otherStmt.execute ("commit");
otherStmt.close ();
}
/**
* Show the result set properties like type, concurrency type, fetch
* size,..., etc.
*/
public static void showProperty (ResultSet rset) throws SQLException
{
// Verify the result set type
switch (rset.getType())
{
case ResultSet.TYPE_FORWARD_ONLY:
System.out.println ("Result set type: TYPE_FORWARD_ONLY");
break;
case ResultSet.TYPE_SCROLL_INSENSITIVE:
System.out.println ("Result set type: TYPE_SCROLL_INSENSITIVE");
break;
case ResultSet.TYPE_SCROLL_SENSITIVE:
System.out.println ("Result set type: TYPE_SCROLL_SENSITIVE");
break;
default:
System.out.println ("Invalid type");
break;
}
// Verify the result set concurrency
switch (rset.getConcurrency())
{
case ResultSet.CONCUR_UPDATABLE:
System.out.println
("Result set concurrency: ResultSet.CONCUR_UPDATABLE");
break;
case ResultSet.CONCUR_READ_ONLY:
System.out.println
("Result set concurrency: ResultSet.CONCUR_READ_ONLY");
break;
default:
System.out.println ("Invalid type");
break;
}
// Verify the fetch size
System.out.println ("fetch size: "+rset.getFetchSize ());
System.out.println ();
}
/* Generic cleanup.*/
public static void cleanup (Connection conn) throws SQLException
{
Statement stmt = conn.createStatement ();
stmt.execute ("UPDATE EMP SET SAL = SAL - 500");
stmt.execute ("COMMIT");
stmt.close ();
}
}
person
bondkn
schedule
30.08.2014
TYPE_SCROLL_SENSITIVE
вызываетrefreshRow
неявно. Подробнее о реализации Oracle см. - person Marmite Bomber   schedule 10.02.2019