Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数据库时间戳不匹配_Java_Sql Server_Hibernate_Struts_Timestamp - Fatal编程技术网

Java 数据库时间戳不匹配

Java 数据库时间戳不匹配,java,sql-server,hibernate,struts,timestamp,Java,Sql Server,Hibernate,Struts,Timestamp,我在struts2中有一个操作,它将查询数据库中的一个对象,然后通过一些更改复制它。然后,它需要从副本中检索新的objectID,并创建一个名为objectID.txt的文件 以下是相关代码: 行动类: ObjectVO objectVOcopy = objectService.searchObjects(objectId); //Set the ID to 0 so a new row is added, instead of the current one being updated obj

我在struts2中有一个操作,它将查询数据库中的一个对象,然后通过一些更改复制它。然后,它需要从副本中检索新的objectID,并创建一个名为objectID.txt的文件

以下是相关代码:

行动类:

ObjectVO objectVOcopy = objectService.searchObjects(objectId);
//Set the ID to 0 so a new row is added, instead of the current one being updated
objectVOcopy.setObjectId(0);
Date today = new Date();
Timestamp currentTime = new Timestamp(today.getTime());
objectVOcopy.setTimeStamp(currentTime);
//Add copy to database
objectService.addObject(objectVOcopy);
//Get the copy object's ID from the database
int newObjectId = objectService.findObjectId(currentTime);
File inboxFile = new File(parentDirectory.getParent()+"\\folder1\\folder2\\"+newObjectId+".txt");
ObjectDAO

//Retrieve identifying ID of copy object from database
List<ObjectVO> object = getHibernateTemplate().find("from ObjectVO where timeStamp = ?", currentTime);
return object.get(0).getObjectId();
//从数据库中检索复制对象的标识ID
List object=getHibernateTemplate().find(“来自ObjectVO,其中timeStamp=?”,currentTime);
返回object.get(0.getObjectId();
问题是ObjectDAO搜索方法通常不会返回任何内容。调试时,我注意到传递给它的时间戳currentTime通常与数据库中的值相差约1-2ms。我已经解决了这个bug,将hibernate查询改为搜索时间戳在传递时间3ms以内的对象,但我不确定这种差异来自何处。我没有重新计算当前时间;我正在使用与写入数据库相同的方法从数据库中检索。我还担心,当我将其部署到另一台服务器时,差异可能会更大。除了objectID之外,这是唯一的唯一标识符,所以我需要使用它来获取复制对象

有人知道为什么会发生这种情况吗?有没有比在一个范围内搜索更好的方法?我正在使用Microsoft SQL Server 2008 R2顺便说一句


谢谢。

SQL Server日期时间数据类型的精度与您在其他语言中生成的数据类型不完全匹配。SQL Server舍入到最接近的0.003-这就是为什么您可以说:

DECLARE @d DATETIME = '20120821 23:59:59.997';
SELECT @d;
结果:

2012-08-21 23:59:59.997
2012-08-22 00:00:00.000
然后尝试:

DECLARE @d DATETIME = '20120821 23:59:59.999';
SELECT @d;
结果:

2012-08-21 23:59:59.997
2012-08-22 00:00:00.000
由于您使用的是SQL Server 2008 R2,因此应确保使用DATETIME2数据类型而不是DATETIME


这就是说,@RedFilter提出了一个很好的观点——当您可以使用生成的ID时,为什么还要依赖时间戳呢?

SQL Server的DATETIME数据类型的精度与您在其他语言中可以生成的数据类型不完全匹配。SQL Server舍入到最接近的0.003-这就是为什么您可以说:

DECLARE @d DATETIME = '20120821 23:59:59.997';
SELECT @d;
结果:

2012-08-21 23:59:59.997
2012-08-22 00:00:00.000
然后尝试:

DECLARE @d DATETIME = '20120821 23:59:59.999';
SELECT @d;
结果:

2012-08-21 23:59:59.997
2012-08-22 00:00:00.000
由于您使用的是SQL Server 2008 R2,因此应确保使用DATETIME2数据类型而不是DATETIME

这就是说,@RedFilter提出了一个很好的观点——当您可以使用生成的ID时,为什么还要依赖时间戳呢?

这感觉不对

除了objectID之外,这是唯一的唯一标识符

数据库具有唯一标识符的概念是有原因的。您应该真正使用它来检索对象的实例

您可以在Hibernate会话上使用get方法,并利用会话和二级缓存

使用这种方法,每次检索对象时都会执行查询。

这感觉不对

除了objectID之外,这是唯一的唯一标识符

数据库具有唯一标识符的概念是有原因的。您应该真正使用它来检索对象的实例

您可以在Hibernate会话上使用get方法,并利用会话和二级缓存


使用这种方法,每次检索对象时都会执行查询。

我无法更改数据库表,但你是说如果我在当前3ms范围内搜索,我不会错过返回和应该返回的对象?我找到了这个,看起来我需要在3ms范围内搜索,因为我没有能力更改数据库表,但是你是说如果我在当前3ms范围内搜索,我不会错过返回和应该返回的对象?我找到了这个,看起来我需要在3ms内搜索。问题是我正在添加一个新对象,我不知道objectID是什么。这就是为什么我需要进入数据库并找到it@user1287523SQL Server可以告诉您生成的objectID使用的是SCOPE_IDENTITY()。这比使用时间戳可靠得多——虽然不太可能,但两个用户不可能同时(或在4ms内)插入一行吗?您的
DATETIME
列肯定不是唯一的吗?问题是,我不知道如何使用Hibernate实现这一点——Hibernate可以调用存储过程吗?如果是这样,那么解决方案就很简单了。我在遵循提供的代码时遇到了问题,所以具体的用例还不清楚。我完全同意时间戳不是唯一标识符的好候选。这就是唯一标识符的作用。是的,正如您所说,这是非常不可能的,但理论上是可能的,因为我们的业务逻辑是,在时间戳范围内可以有两个条目。我将研究SCOPE_IDENTITY(),一定有办法用HibernateEyp实现它,找到了答案。当我调用
objectService.addObject(objectVOcopy)时
用于调用
getHibernateTemplate().saveOrUpdate(objectVOcopy)
我将其更改为
objectVOcopy=getHibernateTemplate().merge(objectVOcopy)
,它似乎正确地将行添加到数据库中,然后将行返回到原始对象。谢谢大家!问题是我正在添加一个新对象,而我不知道objectID是什么。这就是为什么我需要进入数据库并找到it@user1287523SQL Server可以告诉您生成的objectID使用的是SCOPE_IDENTITY()。这比使用时间戳可靠得多——虽然不太可能,但两个用户不可能同时(或在4ms内)插入一行吗?您的
DATETIME
列肯定不是唯一的吗?问题是,我不知道如何使用Hibernate实现这一点——Hibernate可以调用存储过程吗?如果是这样,那么解决方案就很简单了。我在遵循提供的代码时遇到了问题,所以具体的用例还不清楚。我完全同意时间戳不是唯一标识符的好候选。这就是唯一标识符的用途