0

我发现我的网络服务器有奇怪的行为。我对数据库所做的更改并没有反映在我的 Java Servlet 返回的输出中。

我的 servlet 使用 JDBC 连接池连接到 Oracle 数据库。

这是设置:

    <JDBCCONNECTIONPOOL name="mypool" datasourceclassname="oracle.jdbc.pool.OracleDataSource" steadypoolsize="8" 

maxpoolsize="32" poolresizequantity="2" idletimeout="300" maxwaittime="60000" 

connectionvalidationrequired="off" connectionvalidationmethod="auto-commit" 

validationtablename="" failallconnections="off" transactionisolationlevel="serializable" 

isolationlevelguaranteed="off">

要看到我的表更改,我需要重新启动我的网络服务器。

这是某种故障,还是我需要更改配置?

我确定我在 SQL Developer 上提交了所有更改。

谢谢

Ps 解释将不胜感激(加分!)

4

1 回答 1

1

我看到你有:

 transactionisolationlevel="serializable" 

如果这是映射到 oracle 连接,那么您看到的行为就是我所期望的。

即即使其他会话提交,在与数据库的 java 连接提交之前,您也不会看到该行。

例如,以 2 个 sql*plus 会话为例。

SESSION 1                                   SESSION 2
SQL> create table foobar(id number);        SQL> alter session set isolation_level=serializable;

Table created.                              Session altered.

SQL> insert into foobar values (1);         SQL> select * from foobar;

1 row created.                              no rows selected

到目前为止的预期结果,会话 2 看不到该行。现在我们在会话 1 中提交:

SQL> commit;                               

Commit complete.
                                           SQL> select * from foobar;

                                           no rows selected

但仍然会话 2 看不到它。

                                           SQL> commit;

                                           Commit complete.

                                           SQL> alter session set isolation_level=serializable;

                                           Session altered.

                                           SQL> select * from foobar;

                                                   ID
                                           ----------
                                                    1

但现在它可以一旦 session2 提交。

于 2013-01-03T14:58:08.830 回答