- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在以前版本的 jaybird (2.2) 中,我能够对 Firebird 服务器执行服务 API 以获取 Activity 事务标记:OIT、OAT、Next 等。
在 3.0 版中,我找不到正确的方法。只有 ISC 常量(如 isc_info_oldest_snapshot)但没有方法。
因此,我看到了一种方法:通过 StatisticsManager
查询数据库 header 。但这并不是那么容易,因为它会返回需要解析的文本:
StatisticsManager SM = new FBStatisticsManager(); //"PURE_JAVA", "NATIVE", "EMBEDDED"
SM.setHost("localhost");
SM.setUser("sysdba");
SM.setPort(3053);
SM.setPassword("masterkey");
SM.setDatabase("c:\\Firebird\\3.0.2\\examples\\empbuild\\EMPLOYEE.FDB");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
SM.setLogger(baos);
SM.getHeaderPage();
String outputstr2 = new String( baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8 );
现在我需要解析文本:
Database "C:\FIREBIRD\3.0.2\EXAMPLES\EMPBUILD\EMPLOYEE.FDB"
Database header page information:
Flags 0
Generation 806
System Change Number 12
Page size 8192
ODS version 12.0
Oldest transaction 520
Oldest active 521
Oldest snapshot 521
Next transaction 521
Sequence number 0
Next attachment ID 857
Implementation HW=AMD/Intel/x64 little-endian OS=Windows CC=MSVC
Shadow count 0
Page buffers 0
Next header page 0
Database dialect 3
Creation date Apr 15, 2016 17:38:34
Attributes
Variable header data:
Database backup GUID: {6F41E937-76D5-4C67-6CAE-F8556AD27BEE}
Database GUID: {EE5B2713-7B17-43B0-0CB3-0616B4B8A63D}
*END*
是否可以获得直接值?
更新:旧版本的代码是:
/** [ActiveCount, OAT, OST, OIT, Next] */
public static int[] getTxInfo( final GDS gds,
final String host,
final int port,
final String databasePath,
final String user,
final String password ) throws Exception {
final byte[] queryItems = {
ISCConstants.isc_info_oldest_transaction,
ISCConstants.isc_info_oldest_active,
ISCConstants.isc_info_oldest_snapshot,
ISCConstants.isc_info_next_transaction,
ISCConstants.isc_info_active_transactions,
ISCConstants.isc_info_end
};
byte[] response = queryDB(
gds, host, port, databasePath, user, password,
queryItems, DEFAULT_BUFFER_SIZE
);
int i = 0;
final int[] result = new int[5];
while ( response[i] != ISCConstants.isc_info_end ) {
final byte code = response[i++];
switch ( code ) {
case ISCConstants.isc_info_active_transactions: {
//здесь идет столько блоков isc_info_active_transactions, сколько
//реально активных транзакций в данный момент
final int valueLen = gds.iscVaxInteger( response, i, LENGTH_LEN );
i += LENGTH_LEN;
//final int res = gds.iscVaxInteger( response, i, valueLen );
i += valueLen;
result[0]++;
break;
}
case ISCConstants.isc_info_oldest_active: {
final int valueLen = gds.iscVaxInteger( response, i, LENGTH_LEN );
i += LENGTH_LEN;
final int res = gds.iscVaxInteger( response, i, valueLen );
i += valueLen;
result[1] = res;
break;
}
case ISCConstants.isc_info_oldest_snapshot: {
final int valueLen = gds.iscVaxInteger( response, i, LENGTH_LEN );
i += LENGTH_LEN;
final int res = gds.iscVaxInteger( response, i, valueLen );
i += valueLen;
result[2] = res;
break;
}
case ISCConstants.isc_info_oldest_transaction: {
final int valueLen = gds.iscVaxInteger( response, i, LENGTH_LEN );
i += LENGTH_LEN;
final int res = gds.iscVaxInteger( response, i, valueLen );
i += valueLen;
result[3] = res;
break;
}
case ISCConstants.isc_info_next_transaction: {
final int valueLen = gds.iscVaxInteger( response, i, LENGTH_LEN );
i += LENGTH_LEN;
final int res = gds.iscVaxInteger( response, i, valueLen );
i += valueLen;
result[4] = res;
break;
}
case ISCConstants.isc_info_truncated: {
//этот код означает "буфер слишком маленький, дайте больше"
//обычно это бывает когда слишком много активных транзакций
//сначала пробуем увеличить буфер
if ( response.length == DEFAULT_BUFFER_SIZE ) {
response = queryDB(
gds, host, port, databasePath, user, password,
queryItems, 32 * DEFAULT_BUFFER_SIZE
);
result[0] = 0;//на всякий случай
//начинаем разбор заново
i = 0;
} else {
//32Кб буфера оказалось тоже недостаточно -- пичалька. Но
//делать нечего -- просто обойдемся без числа активных транзакций
response = queryDB(
gds, host, port, databasePath, user, password,
new byte[]{
ISCConstants.isc_info_oldest_transaction,
ISCConstants.isc_info_oldest_active,
ISCConstants.isc_info_oldest_snapshot,
ISCConstants.isc_info_next_transaction,
ISCConstants.isc_info_end
}, DEFAULT_BUFFER_SIZE
);
result[0] = -1;
//начинаем разбор заново
i = 0;
}
break;
}
default:
throw new FBSQLException( "Unrecognized response code: " + code + " (response=" + Arrays.toString( result ) + ")" );
}
}
return result;
}
在哪里
public static byte[] queryDB( final GDS gds,
final String host,
final int port,
final String databasePath,
final String user,
final String password,
final byte[] queryItems,
final int bufferLength ) throws Exception {
return doWithDB(
gds, host, port, databasePath, user, password,
new DBOperation<byte[]>() {
public byte[] doWithDB( final GDS gds,
final IscDbHandle db ) throws GDSException {
return gds.iscDatabaseInfo(
db,
queryItems,
bufferLength
);
}
}
);
}
够了吗?
最佳答案
我已将功能添加到 Jaybird 3.0.0,请参阅 this commit .
我添加了两种获取此信息的方法:
使用 StatisticsManager
:
StatisticsManager statsMan = new FBStatisticsManager();
statsMan.setHost("localhost");
statsMan.setDatabase("/path/to/your.fdb");
statsMan.setUser("youruser");
statsMan.setPassword("yourpassword");
DatabaseTransactionInfo info = statsMan.getDatabaseTransactionInfo();
使用现有Connection
获取此信息的简便方法:
try (Connection connection = dataSource.getConnection()) {
DatabaseTransactionInfo info = FBStatisticsManager
.getDatabaseTransactionInfo(connection);
}
唯一的要求是连接实例解包到 FirebirdConnection
接口(interface)。
如果您使用的是 Maven,则可以尝试从 Sonatype OSS 快照存储库获取最新的 Jaybird 快照:https://oss.sonatype.org/content/repositories/snapshots (您需要将此快照存储库添加到您的 Maven 配置中)。
<dependency>
<groupId>org.firebirdsql.jdbc</groupId>
<artifactId>jaybird-jdk18</artifactId>
<version>3.0.0-SNAPSHOT</version>
</dependency>
否则您可以使用以下方式下载快照:
对于 future 的版本,我会考虑是否可以以更通用的方式公开数据库信息查询工具,这样就不必使用内部 FbDatabase
接口(interface)。
关于java - Jaybird 3 和 Firebird 交易信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42945173/
我有一个关于 Firebird 客户端和服务器版本的问题。我知道由于 ODS 更改,数据库文件必须与 Firebird 服务器匹配。即 Firebird 建议在服务器版本 2.5.1 和 2.5.2
是否可以使用相同 Firebird 版本的 Firebird Embedded 打开 Firebird 数据库文件?当然,我知道我不能同时通过 FB Embedded 和 FB 打开同一个文件。但在关
首先我读到了这个问题: Firebird database replication 但我不想复制...我只想将数据库上已更改的数据添加到我们的主数据库中。有什么想法吗? 最佳答案 AFAICT 这也是
我同时使用 Firebird 嵌入式和 Firebird 服务器,有时我需要使用如下程序重新索引表: CREATE PROCEDURE MAINTENANCE_SELECTIVITY ASDECLAR
firebird 是否支持事务模式更改?在我看来,MySQL 没有(我说得对吗?)。 最佳答案 我打算发布一个简单的"is",但 Stack Overflow 不接受少于 15 个字符的答案。简而言之
我正在尝试将 Firebird 2.5.1 迁移到 Firebird 3.0 做了什么: 备份 Firebird 2.5.1 在 Firebird 3 上恢复 问题是并不是所有的表都被迁移了;过程、触
我的意思是,即使数据库为空,您也必须删除 varchar(50) 字段并重新创建它以使其成为 varchar(30)。更别说约束了…… 这是非常令人沮丧的。我是 SYSDBA,Firebird 使非常
当我尝试更改 Firebird 中不同所有者的表时,出现此错误: unsuccessful metadata update MODIFY RDB$RELATION_FIELDS failed no p
我有下表 create table LIST_PIPE_TABLE ( ID INT, ITEM VARCHAR(4000), IS_FOLDER VARCHAR
有没有一种快速的方法来列出为数据库定义的所有实际上没有被任何字段使用的 Firebird 域?我有一个包含许多表和许多域的大型数据库,似乎其中很多不再使用,所以我想是时候进行清理了! 我认为这可以通过
我有一个表 t,其中一列是 int 类型,有几行。 我想循环它。当然,我可以为此编写一个选择查询。不过我是学程序的,写了个程序, set term ^; create procedure qt ret
我正在尝试使用 FlameRobin 打开一个 .fdb (Firebird) 数据库,但它给了我以下错误消息: *** IBPP::SQLException *** Context: Databas
我有一个旧版 Firebird(版本 2.5.2)数据库,并使用 FlameRobin(版本 0.0.2.1851)来检查它。 我已在 RDB$RELATION_CONSTRAINTS 表上运行以下查
我是这里的 Firebird 新手。我正在尝试从 ASP.Net 应用程序使用 Firebird Embedded。一切都连接正常,但我遇到了列名称长度的问题。我正在尝试创建一个名为“Orchard_
刚刚开始将 Firebird 与 Delphi XE 结合使用。需要一些从客户端计算机连接到服务器的帮助。 我可以 ping 服务器,因此存在连接。但是当我从 firebird/bin 文件夹运行 i
我在 Ubuntu 中打开命令提示符,然后登录 Firebird,如下所示: $ isql-fb SQL> connect "localhost:/var/lib/firebird/2.5/data/
已下载 Firebird 数据库 Firebird-3.0.3.32900-0_x64_pdb.zip。解压文件夹install_service.bat并能够访问EMPLOYEE.FDB数据库。无需
如何在 Firebird 中将多个数据库合并为一个?我尝试了 fbexport,但没有在 Ubuntu 上编译 fbexport,我不断收到此错误。 g++ -pthread -lfbclient -
我想查询以下内容:所有表及其列和数据类型 到目前为止,我从 http://www.firebirdfaq.org/faq174/ 得到了这个 select f.rdb$relation_name, f
我有一个接近 4GB 文件系统限制大小的 firebird 数据库。如何将单个数据库文件拆分为多个文件? 最佳答案 对于单个文件数据库,Firebird 数据库可以跨越数 TB。 InterBase
我是一名优秀的程序员,十分优秀!