小编usr*_*ΛΩΝ的帖子

无论如何,我都无法在Hibernate中批量处理MySQL INSERT语句

我目前正面临众所周知和常见的Hibernate插入批处理问题.

我需要保存500万行的批次.我首先尝试使用更轻的有效载荷.由于我必须只插入两种类型的实体(首先是所有类型A的记录,然后是所有类型B的记录,都指向公共类型C ManyToOne父级),我想从JDBC批量插入中获取最大优势.

我已经阅读了很多文档,但我没有尝试过.

  • 我知道为了使用批量插入,我不能使用实体生成器.所以我删除了AUTO_INCREMENTID,我用一个技巧设置了ID:SELECT MAX(ID) FROM ENTITIES每次都增加.
  • 我知道我必须定期清理会议.我将提前发布代码,但无论如何我每500个元素执行一次事务.
  • 我知道我必须设置hibernate.jdbc.batch_size与我的应用程序的批量大小一致,所以我在LocalSessionFactoryBean(Spring ORM集成)中设置它
  • 我知道我必须在连接URL中重写批量语句.

这是我的实体

共同的父实体.这将首先插入到单个事务中.我不关心这里的自动增量列.每批作业只有一个记录

@Entity
@Table(...)
@SequenceGenerator(...)
public class Deal
{

    @Id
    @Column(
            name = "DEAL_ID",
            nullable = false)
    @GeneratedValue(
            strategy = GenerationType.AUTO)
    protected Long id;

    ................
}
Run Code Online (Sandbox Code Playgroud)

其中一个孩子(假设每批2.5M记录)

@Entity
@Table(
        name = "TA_LOANS")
public class Loan
{

    @Id
    @Column(
            name = "LOAN_ID",
            nullable = false)
    protected Long id;

    @ManyToOne(
            optional = false, …
Run Code Online (Sandbox Code Playgroud)

java mysql hibernate jdbc batch-processing

18
推荐指数
1
解决办法
6310
查看次数

嵌套的if-else行为没有大括号

请考虑以下未格式化的嵌套if-elseJava代码

if (condition 1)
if (condition 2)
action 1;
else
action 2;
Run Code Online (Sandbox Code Playgroud)

我的问题是:根据Java语言规范,如果else分支适用该怎么办?

通过手工重新格式化和添加括号,这两个中的哪一个是正确的?

第1块:

if (condition 1) {
    if (condition 2) {
        action 1;
    } else
        action 2;
    }
}
Run Code Online (Sandbox Code Playgroud)

第2块:

if (condition 1) {
    if (condition 2) {
        action 1;
    }
}
else {
    action 2;
}
Run Code Online (Sandbox Code Playgroud)

java syntax if-statement

16
推荐指数
2
解决办法
9783
查看次数

IabHelper.queryPurchases中的NullPointerException

今天我发现我的Android应用程序的应用程序崩溃报告涉及以下堆栈跟踪:

java.lang.NullPointerException: Attempt to invoke interface method 'android.os.Bundle com.android.vending.billing.IInAppBillingService.getPurchases(int, java.lang.String, java.lang.String, java.lang.String)' on a null object reference
at com.myapp.utils.IabHelper.queryPurchases(IabHelper.java:878)
at com.myapp.utils.IabHelper.queryInventory(IabHelper.java:572)
at com.myapp.utils.IabHelper.queryInventory(IabHelper.java:545)
at com.myapp.utils.IabHelper$2.run(IabHelper.java:645)
at java.lang.Thread.run(Thread.java:818)
Run Code Online (Sandbox Code Playgroud)

(由于自定义重新格式化,行号从原始版本更改 - 或者看起来像是原始版本)

通常,人们会修改自己的代码来检查未分配的类成员.问题是此代码是从Android SDK直接复制和粘贴的,因为IabHelperAndroid SDK 提供的类是实现应用内结算v3的良好起点

罪恶的线是第二个

logDebug("Calling getPurchases with continuation token: " + continueToken);
Bundle ownedItems = mService.getPurchases(3, mContext.getPackageName(), itemType, continueToken);
Run Code Online (Sandbox Code Playgroud)

似乎在调用方法时服务未连接.在Nexus 5设备上发生此错误(根据Developer Console)

  • 这是Android 5的已知问题吗?
  • 是否有最新版本的IAB Helper?
  • 我能做些什么,而不是手动编辑代码来处理NPE?

java android android-5.0-lollipop

16
推荐指数
1
解决办法
3619
查看次数

无效/禁用实体框架缓存

我看到EF缓存有很多问题,但我找不到解决问题的方法.

直截了当的问题是

如何完全禁用Entity Framework 6缓存?或者,我可以通过编程方式告诉EF忘记缓存,因为数据发生了什么变化?

背景

首先,我继承了一个由EF(模型优先定义实体)和普通旧SQL(操纵数据)的奇怪混合构成的应用程序.我做的是重构应用程序,以便:

  • 简单查询(如GetAll()实体)使用EF6 LINQ
  • DbContext.Database.Connection在需要时使用SQL中的复杂数据操作
  • 添加Spring.Web支持以启用DI和交易(尚未)

在目前,我重新组织了代码,以便应用程序的主要功能(在大型数据集上运行复杂的SQL查询)像以前一样工作,但随后使用尽可能多的实体框架更智能地完成查找域实体操作

大多数......

我继承的其中一个页面是一个多重复选框页面,我将向您展示最佳理解.我不会讨论之前的实现者的选择,因为修复我当前的问题和后来的重构代码比阻止破坏功能的开发更便宜.

这就是页面的样子

在此输入图像描述

基本上该Controller方法如下

    [HttpPost]
    public ActionResult Index(string[] codice, string[] flagpf, string[] flagpg, string[] flagammbce, string[] flagammdiv, string[] flagammest,
        string[] flagintab, string[] flagfinanz, string[] flagita, string[] flagest, string pNew){
            Sottogruppo2015Manager.ActivateFlagFor("pf", flagpf);
            Sottogruppo2015Manager.ActivateFlagFor("pg", flagpg);
            Sottogruppo2015Manager.ActivateFlagFor("ammbce", flagammbce);
            Sottogruppo2015Manager.ActivateFlagFor("ammdiv", flagammdiv);
            Sottogruppo2015Manager.ActivateFlagFor("ammest", flagammest);
            Sottogruppo2015Manager.ActivateFlagFor("intab", flagintab);
            Sottogruppo2015Manager.ActivateFlagFor("finanz", flagfinanz);
            Sottogruppo2015Manager.ActivateFlagFor("ita", flagita);
            Sottogruppo2015Manager.ActivateFlagFor("est", flagest);

            return RedirectToAction("Index", new { pNew });
 }
Run Code Online (Sandbox Code Playgroud)

每个string[]参数都是表中的一列.该 …

c# linq caching entity-framework

16
推荐指数
2
解决办法
3万
查看次数

像字段添加或删除这样的类更改是否保持Serializable的向后兼容性?

在可能需要修改可序列化类并保持向后兼容性的情况下,我有一个关于Java序列化的问题.

我来自深入的C#经验,所以请允许我将Java与.NET进行比较.

在我的Java场景中,我需要使用Java的运行时序列化机制序列化对象,并将二进制数据存储在永久存储中以便将来重用这些对象.问题是,将来,课程可能会发生变化.可以添加或删除字段.

我不太了解Java序列化,除了这篇关于如何在处理序列化时不用Java编程的精彩文章.正如我想象的那样(d),serialVersionUID在Java序列化中起着关键作用,这就是我需要你帮助的地方.

除了文章的例子(我知道它的编码很糟糕),当我在修改类之后要求更新它时,该字段是否应该被修改?

我记得在.NET世界中,当我添加新字段时,我必须将[OptionalField]属性添加到字段以获得向后兼容性,因此CLR不会在旧的序列化数据中要求它.此外,当我需要弃用字段时,我必须只删除公共方法而不是私有字段.

最佳序列化的准则是什么?

谢谢.

[添加]这是一个例子.假设我有Foo课

public class Foo {
    private String bar;
}
Run Code Online (Sandbox Code Playgroud)

然后我改为:

public class Foo {
    private String bar;
    private Integer eggs;
}
Run Code Online (Sandbox Code Playgroud)

这两个版本之间的兼容性是否破裂?如果我在编译"newFoo"时反序列化"oldFoo",那么egg会等于null还是抛出异常?我更喜欢第一个,显然!!

java serialization

15
推荐指数
1
解决办法
1万
查看次数

实体框架向导在MySQL上崩溃

我的问题与类似,但崩溃发生在以后.我必须在SQL Server和MySQL之间互操作EF数据库优先模型.更具体地说,我的应用程序根据连接字符串和配置设置(DB_TYPE=MYSQL等等)向SQL Server或MySQL发出了简单的SQL查询,使两个数据库具有相同的结构并保持在一起,以便对一个模式的每个修改都重新应用于其他.

现在,我使用SQL Server数据库优先模型为应用程序添加了EF支持.我现在必须让应用程序在MySQL上运行.为了验证旧的开发人员没有在两个DBMS之间留下不对称的东西,我试着Update model against database*这次我在localhost上选择了MySQL连接到我的开发数据库.

点击Next下面的屏幕后,它将崩溃并返回EDMX编辑器

数据模型向导

我需要继续这个项目,我已经坚持了一段时间.

这是我的Web.config片段:

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决我的问题?我为Visual Studio重新安装了MySQL工具,但没有帮助.

*我使用Visual Studio的本地化版本,因此我不知道所有命令的原始英语

mysql entity-framework visual-studio-2013

15
推荐指数
1
解决办法
6692
查看次数

将现有容器从 Hyper-V 迁移到 WSL2 技术

在 DockerCon 2020 之后,我热情地下载了 Windows 10 2004 并尝试将 Docker Desktop 升级到 WSL 2 容器并进行实验。

我有几个容器,特别是几个数据库以及它们存储在卷中的数据。以 Postgres 和 MS SQL Server 为例。

我不想丢失数据,尽管这并不重要。我使用 Docker 卷而不是 OS 挂载,因为我反复看到建议使用 Windows 挂载进行数据库数据存储。

当我第一次启用 WSL-2 时,我所有的容器和卷都消失了。

我想问一下是否有任何(推荐的)程序或工具可以将基于 Hyper-V 的容器连同它们的数据一起迁移到 WSL-2。

图像可以很容易地重新下载。容器设置和数据迁移到 WSL-2 怎么样?

当然,我可以手动完成。我可以busybox使用另一个busybox实例将卷转储到我的本地驱动器(作为tar)并使用另一个busybox实例进行恢复

docker docker-desktop

14
推荐指数
1
解决办法
4019
查看次数

更好的DateTime?或使用默认值(DateTime)为NULL?

我正在设计一个具有私人消息系统的C#/ NHibernate网站.我希望管理员检查用户是否以及何时阅读了消息,并一起突出显示用户尚未阅读的消息.要实现这两个目标,我找到了两个选择:

选项1

class Message
{
    DateTime? Read;
}
Run Code Online (Sandbox Code Playgroud)

哪里Read==null还没有读过

选项2

class Message
{
    DateTime Read;
}
Run Code Online (Sandbox Code Playgroud)

where Read==default(DateTime)(公关1月1日,0:00:00)表示尚未阅读.

在大学里,我被教会使用该NULL值来处理所有特殊情况,并且使用可空类型似乎是一个不错的选择,因为通过检查是否是未读消息来查找未读消息看起来更容易NULL.

但是,使用可空类型至少涉及代码中的装箱和拆箱,性能会下降.另一方面,查询未读消息意味着比较值(但可以将其编入索引)

我的问题是

你建议的方法是什么?在这种情况下,最佳做法会有什么建议?

c# nhibernate

13
推荐指数
2
解决办法
4364
查看次数

在Eclipse 4.6 Neon中使用注释处理器

我正在维护一个Java 7 Web项目,该项目使用多行注释来存储某些常量.

我可以在使用Mars时配置Eclipse,所以我可以在部署该应用程序的情况下启动Tomcat,它就像魅力一样......

直到我升级!现在,尽管配置完成,仍未完成注释处理.

我发现这个问题是由Eclipse 4.6的一个特性引起的,如此处所述

批处理编译器和IDE中支持Java 6批注处理器.按照设计,Java 6处理器仅在构建期间执行,而不是在编辑时执行.(bug 188558)

简而言之,链接的错误说明注释处理已经从Eclipse的增量编译中删除(可能是Build automatically???),这是出于合法的原因.事实上,当我使用Ant在CI服务器中编译项目时,注释会照常处理.

但我不能再在Eclipse中运行我的项目了.它完全取决于Multiline注释的正确处理.

到目前为止,我已尝试禁用该Build Automatically标志并手动构建项目.没有结果.

我也尝试Java Compiler -> Annotation processing -> Factory Path,选择multiline-stringjar,转到Advanced属性并取消选中Run this container's processors in batch mode,尽管复选框是违反直觉的(我的意思是,它应该被命名为"以增量模式运行"并且默认情况下未选中,根据上面提到的错误)

该应用程序是一个Web应用程序,因此每次尝试将其部署到本地Tomcat.

你觉得我能做些什么?

java eclipse annotations

13
推荐指数
1
解决办法
1451
查看次数

在PHP 5.3中重新引入$ HTTP_POST_VARS

我需要在共享托管环境中运行遗留 PHP应用程序.我已经向我的客户承诺我会支持该遗留应用程序一段时间,但我发现它不起作用,因为它广泛使用已弃用的$HTTP_POST_VARS.

降级PHP不是一种选择.修补应用程序可能是不可行的,因为PHP文件是从Windows可执行文件生成的(我不是在开玩笑!),每次从桌面重新生成站点时,我们都会丢失修改.

我问是否有办法告诉PHP重新引入$HTTP_POST_VARS主机上的所有网站或仅针对特定的虚拟主机.任何其他选项/建议表示赞赏

php

12
推荐指数
1
解决办法
2万
查看次数