我正在使用apache derby作为我的数据库.我能够在数据库中执行插入操作.以下是试图显示我唯一的表'MAINTAB'的内容的代码的摘录.java.sql.Connection的实例是'dbconn'.
ResultSet word;
Statement query;
String getData="SELECT THEWORD FROM MAINTAB";
try{
System.out.println(dbconn.getAutoCommit());
query = dbconn.createStatement();
word = query.executeQuery(getData);
query.close();
dbconn.setAutoCommit(false);
System.out.println(dbconn.getAutoCommit());
for(;word.next();)
System.out.println(word.getString(1));
}catch(Throwable e){
System.out.println("Table fetch failed or result data failed");}
Run Code Online (Sandbox Code Playgroud)
以下是输出.
org.apache.derby.jdbc.EmbeddedDriver loaded.
Database testDB connected
true
false
Table fetch failed or result data failed
---SQLException Caught---
SQLState: XCL16
Severity: 20000
Message: ResultSet not open. Operation 'getString' not permitted. Verify that autocommit is OFF.
java.sql.SQLException: ResultSet not open. Operation 'getString' not permitted. Verify that autocommit is OFF. …
Run Code Online (Sandbox Code Playgroud) 我正在使用Apache Derby编写Java应用程序,我正在寻找"explain"语句的等价物(例如,为mySQL工作).它不适用于德比.有类似的东西吗?
我想创建一个将使用Apache Derby Embedded DB的Java独立Java应用程序.
我想使用JPA因为我对它非常熟悉并且可能超过Hibernate(但是如果它变得更容易,则欢迎其他人使用JPA).
是否有任何示例在Derby嵌入式数据库上使用JPA而不是Hibernate?我在寻找,但我找不到任何有用的示例代码.我想要一个类似教程的东西,它将告诉我需要在我的类路径中添加哪些库,哪些是基本文件以及我需要做什么.
如何在德比中的SQL中选择从X行到Y行?
例如:
我试过LIMIT和ROWNUM不起作用,我怎么能在德比中做到这一点?
我正在使用Ubuntu 14.04并安装了Derby 10.12.1.1.我已经按照Apache网站的安装说明进行操作.
我CLASSPATH
被设定为
/usr/local/hadoop/lib/*:/usr/local/hive/lib/*:/usr/local/derby/lib/derbynet.jar:/usr/local/derby/lib/derbytools.jar
Run Code Online (Sandbox Code Playgroud)
当我尝试开始德比
hduser@HadoopMaster:/usr/local/derby/data$ /usr/local/derby/bin/startNetworkServer
Run Code Online (Sandbox Code Playgroud)
我明白了
Tue Nov 10 23:50:18 AEDT 2015 : Security manager installed using the Basic server security policy.
java.lang.SecurityException: sealing violation: package org.apache.derby.impl.services.timer is sealed
at java.net.URLClassLoader.getAndVerifyPackage(URLClassLoader.java:399)
at java.net.URLClassLoader.definePackageInternal(URLClassLoader.java:419)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:451)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at …
Run Code Online (Sandbox Code Playgroud) 我正在运行一个Java EE应用程序,该应用程序在Payara 4.1.1.172上使用Hibernate 5.2.10.Final和Apache Derby存储后端.我看到的错误信息如
Caused by: java.sql.SQLDataException: A truncation error was encountered trying to shrink VARCHAR () FOR BIT DATA '(Binärer Datenwert wird nicht angezeigt)' to length 255.
Run Code Online (Sandbox Code Playgroud)
这表示Hibernate或Derby或两者都没有在消息的所有部分使用英语错误消息.
我试过了
添加一个
static {
System.setProperty("user.language", "en");
System.setProperty("user.region", "en_US");
}
Run Code Online (Sandbox Code Playgroud)
到一个类,但我似乎没有找到一个确定的方法来在任何异常发生之前加载它,我宁愿保持代码的设置.这同样适用于Locale.setDefault
.
-Duser.language=en
Payara JVM选项?server-config
我看到异常消息的开头是英文的.我希望完整的信息是英文的,包括所有可能的部分.我对解决异常并不感兴趣,这是一个例子.我不是在寻找德语部分的翻译.
非英语消息部分很可能是由服务器启动的德语Ubuntu 18.04引起的.更改操作系统的系统区域设置或服务器可以包装的容器是一种解决方法,但不是解决方案.
甲SSCCE可以被发现在https://gitlab.com/krichter/derby-embedded-data-source-locale-j4ee的CI和示例输出在https://gitlab.com/krichter/derby-embedded-data- source-locale-j4ee/ - /jobs/83525395.SSCCE仅包含服务器启动周围的样板和一个简单的无效本机查询,导致出现德语错误消息,而不是问题中提供的信息.
如果可能,请使用SSCCE验证答案.
我的动机是拥有英语异常消息,以便在开发过程中更轻松地通过搜索引擎找到解决方案而不会篡改系统语言.
我在Scala 2.11中使用spark-hive 2.3.0,并设置了一个单元测试框架。spark-hive附带了TestHiveContext
,TestHiveSparkSession
可以方便地从单元测试中调用Hive,而无需运行Hadoop,Spark或集群,这非常适合自动化测试。
Hive需要一个用于其metastore的数据库,以这种方式运行时,它会将Derby用作嵌入式数据库javax.jdo.option.ConnectionURL
,默认配置为jdbc:derby:;databaseName=<file-path>;create=true
。该<file-path>
是在本地文件系统中的位置,是运行德比一个选项。
另一个选择是在内存中运行Derby,通常就像将此URL更改为一样容易jdbc:derby:memory:databaseName;create=true
。但是,Hive无法做到这一点,因为配置是在内部HiveUtils
类中进行的,并且不能被覆盖。我曾尝试在Spark Session Builder中对其进行更改,但后来HiveUtils
创建我的时,所做的更改就被淹没了TestHiveContext
。
在我的情况下,最好使用内存数据库,因为我们的开发人员在Windows上运行(肯定不是我/我们的选择),并且在创建这些文件时,经常会出现诸如权限或文件名中的无效字符之类的问题(因为从未真正打算使用Hadoop)才能在Windows上使用),并且由于无法清理(由于这些问题),这些文件通常会被丢弃。我们希望测试是完全独立的,以便它们可以运行和完成而没有副作用,因此可以在多种环境(开发人员,CI,Jenkins,AWS等)中运行。
有趣的是,我在TestHive.scala
:
{ // set the metastore temporary configuration
val metastoreTempConf = HiveUtils.newTemporaryConfiguration(useInMemoryDerby = false) ++ Map(
Run Code Online (Sandbox Code Playgroud)
因此,存在使用内存数据库的标志,但这是不可配置的,并且没有将其设置为的代码路径true
。
有什么方法可以配置或编写此文件,以便TestHive
Derby可以在内存中吗?尝试设置的值javax.jdo.option.ConnectionURL
通过任蜂房的site.xml或HDFS-site.xml中不工作,我认为这是因为如何TestHive
,TestHiveContext
和TestHiveSparkSession
被初始化,他们有自己的代码路径从非测试路径分开。他们提供的功能对测试框架非常有帮助,但显然没有提供覆盖此值和其他设置的方法。
到目前为止,我能看到的最好的选择是重写或编写我自己的TestHiveContext
类,该类从该类中借鉴了很多功能并覆盖了我需要的部分,但是对于我认为可以通过简单配置完成的工作来说,这是一个相对较大的工作更改。
我正在使用Apache Derby以大小为10的数量级存储大量行.每次我启动批量插入时,我都会在表格中插入多达2百万行.该表具有UUID作为其主键,并且具有与另一个表中的UUID的单个约束.插入需要几个小时!为什么?我已经在所有表上创建了INDEX - 但我已经删除了它,因为我相信Derby会自动为每个表创建一个带有主键的INDEX.我正在使用批量更新和准备好的语句,如下所示(以非常简单的形式)
final PreparedStatement addStatement = connection.prepareStatement(...)
int entryCount = 0;
for (final T entry : entries) {
addStatement.addBatch();
entryCount++;
if (entryCount % 1000 == 0) {
addStatement.executeBatch();
addStatement.clearBatch();
entryCount = 0;
}
addStatement.close();
Run Code Online (Sandbox Code Playgroud)
结果如下
05/01/12 12:42:48 Creating 2051469 HE Peaks in DB Table APP.ST_HE_PEAK_TABLE
05/01/12 12:44:18 Progress: Written (10%) 205146/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE
05/01/12 12:46:51 Progress: Written (20%) 410292/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE
05/01/12 12:50:46 Progress: Written (30%) 615438/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE …
Run Code Online (Sandbox Code Playgroud) 我正在使用这个ddl在derby中创建一个简单的演示表:
CREATE TABLE MY_TABLE (
SESSION_ID CHAR(36),
ATTRIBUTE_NAME VARCHAR(200),
CONSTRAINT MY_TABLE_PK PRIMARY KEY (SESSION_ID, ATTRIBUTE_NAME),
);
CREATE INDEX MY_TABLE_IX1 ON MY_TABLE (SESSION_ID);
Run Code Online (Sandbox Code Playgroud)
我想在测试中验证INDEX MY_TABLE_IX1
是否实际创建.
在线搜索我看到了两种可能的方法:
JDBC - >
使用DatabaseMetaData
我可以做一些事情
metadata.getIndexInfo(null, "APP", "MY_TABLE", false, false)
Run Code Online (Sandbox Code Playgroud)
迭代结果集,直到我得到一行
"MY_TABLE_IX1".equals(resultSet.getString("INDEX_NAME"))
Run Code Online (Sandbox Code Playgroud)SQL - >
SELECT c.CONGLOMERATENAME, t.TABLENAME FROM SYS.SYSCONGLOMERATES c
JOIN SYS.SYSTABLES t ON c.TABLEID = t.TABLEID
WHERE c.CONGLOMERATENAME = 'MY_TABLE_IX1' AND t.TABLENAME = 'MY_TABLE'
Run Code Online (Sandbox Code Playgroud)撇开显而易见的(比如我也应按列名称过滤,类似的东西),我遇到一个非常奇怪的行为:
Derby将我的一些索引保存为表单的字符串,SQL181215003216931
使我无法按名称找到这些索引,而其他索引按我在ddl中指定的名称保存.
虽然我给出了一个小例子,但我的实际模式非常大,如果我运行以下内容:
SELECT c.CONGLOMERATENAME, t.TABLENAME FROM SYS.SYSCONGLOMERATES c
JOIN SYS.SYSTABLES t ON …
Run Code Online (Sandbox Code Playgroud)