我的数据库中已有很多现有数据,并希望开发一种点机制,根据每个用户的操作计算每个用户的分数.
我以可插入的方式实现此功能,因此它独立于主逻辑,并且在实体被修改后依赖于发送的Spring事件.
问题是如何处理现有数据.我不想从现在开始收集积分,而是包括所有数据,直到现在.
最实用的方法是什么?我是否应该以提供index()方法的方式设计我的插件,这将强制我的系统从数据库中获取每个单独的实体,发送EntityDirtyEvent,为每个插件触发每个插件,然后更新它,让点被保存在每个实体旁边.这可能会导致很多开销,对吧?
最简单的方法是创建一个复杂的存储过程,然后使index()调用该存储过程.然而,在我看来,这似乎也是一件坏事.既然我必须编写用于计算java中的点的逻辑,为什么还要在SQL中再次使用它?此外,一般而言,我不喜欢将业务逻辑分成不同的层.
有没有人这样做过?请帮忙.
我建议的可能听起来很奇怪,但我有我的理由.
很长一段时间,我们已经有了这个基于Spring的API,它起源于CRUD功能的一组抽象REST服务.然而,随着时间的推移,我们开始构建业务和表示层,直到我们达到死胡同状态.不要误解我的意思,Spring/Hibernate是很棒的框架,构建在JVM之上有其明显的优势,包括性能优于其他Web技术,如PHP.与PHP相比,它为我们提供了更深入的控制方式,如事务处理,多线程处理,处理字节数据,控制本机C++应用程序,使用JNI等.
堆栈明显碰到硬墙的地方,是需求最常变化的地方,即业务层和表示层.将应用程序转变为现代的,以用户为中心的社交应用程序,我们经历了职业生涯中最严峻的挑战.Java EE演示技术难以使用.此外,由于构建测试和部署大型Java应用程序的传统障碍,改变业务需求变得非常漫长.
它也感觉在很大程度上,我们正试图重新发明轮子.在PHP的世界里,已经存在这么多的项目,给你一个完整的管理体系,不可知的任何类型的后端系统(映射挂钩REST/SOAP终点).他们中的许多人已准备好所有这些功能,允许管理员友好地改变各种各样的情况,规则,模板等.另外,基于PHP意味着绝对没有时间浪费在构建和部署上.写下变更,测试,确认它有效,并切换.
我们的想法是,现在要找到一个方法来移动在这样一种正面服务器的基于PHP的应用程序的业务和表示层,并留下纯后端的东西春/休眠.我们有一些担忧,来自我们对Spring的相对缺乏经验.
如果我们使用PHP方法实现业务方法,我们如何保持事务安全性?我的意思是,如果一个业务方法必须向JAVA发出三个单独的HTTP请求,那么我们怎样才能保证它们都将在同一个事务中执行,DB-wise?
有没有办法在两个系统之间使用代理或承诺对象?例如,如果PHP业务方法需要调用Spring搜索方法从数据库中获取对象的集合,然后将其传递给另一个spring方法,这将意味着必须来回传送整个集合.或许,我们可以将其存储在Java侧会话对象,并简单地发送一个空的代理回到前端,其前端能够低音回到另一个JAV方法.
我们很多基于Spring的功能都依赖于使用Spring事件的插件结构.我们如何才能使我们的前端服务器在每个发生的ackend事件上得到通知.我在这里有两个想法:一个后处理过滤器,它只是使用一些命名约定向前端服务器上的控制器发出POST请求.或者...使用某种消息队列,例如JMS或RabbitMQ,或者为什么甚至不能像Reddis那样可以观察数据的变化
谁曾经这样做过?总的来说这是个好主意吗?有任何建议如何解决上述问题?
我希望能够使用下划线的extend功能并实现一个特定的案例.默认情况下,extend使用源的成员覆盖目标的任何现有成员.我的问题是我想保持目的地和源的初始化方法完好无损,所以我做的大致是:
addComponent: function(comp, init) {
var iF;
if (comp.initialize) {
iF = comp.initialize;
delete comp["initialize"];
}
_.extend(this,comp);
if (iF) {
comp.initialize = iF;
comp.initialize.call(this,init);
}
return this;
}
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗 - 通过分离和重新连接?我的意思是,我想保持下划线完整,我不想用任何方法扩展它,因为这是一个非常具体的情况.你发现任何潜力吗?
当我重新渲染骨干视图时,跳过重新渲染图像和谷歌地图之类的东西的好方法是什么?每次重新渲染视图时,我的照片和地图视图都会变得非常糟糕(这种情况经常发生).特别是图像,模板引擎从头开始布局布局,这使得图像标签再次从服务器或缓存中获取位图.
当然,我仍然希望视图对布局保持一种不可知性,所以从技术上来说它不应该知道我们要显示图像,对吧?
我有一个问题,我认为应该很容易解决。
我使用 Hibernate Search 来索引与其他实体有关系的 @Entitiy 类。
每当一个实体指向另一个也应该被索引的实体时,比如上传特定照片的用户,我使用@IndexedEmbedded,它与 HSearch 的自动索引工作得非常好。
但是,我还在 @ManyToOne 关系上设置了一些 @IndexedEmbeded 注释。想象一张有相关评论列表的照片。这些默认情况下是延迟加载的,即在实际需要之前不会从数据库中获取。我注意到当我添加评论时,无论过了多久,它都不会被索引,直到我手动重新索引。然后一切正常。我没有在我拥有的任何其他 IndexedEmbedded 关系中观察到这一点,例如,如果我更改照片的位置,几分钟后,它就会进入索引并且完全可以搜索。
有什么解释吗?解决方案?
我有一个SpringBoot主应用程序,还有一个单独的Maven模块项目,可以作为单独的Jar进行编译。该模块具有一个Spring config类@Configuration,该类带有批注,我希望在主应用程序加载时进行加载。
显然,这并不是开箱即用的(仅将模块包含在主应用程序中)。我还需要做什么,才能使模块配置类也被主应用程序加载?
任何人都可以解释为什么下面的代码编译?
List<Long> longNums = new ArrayList(Arrays.asList("one", "two", "three"));
Run Code Online (Sandbox Code Playgroud)
是否由于类型擦除?
如果我有以下方法:
public <T> T readProperty(String propName, Class<T> type);
Run Code Online (Sandbox Code Playgroud)
我怎样才能确保它会返回,说一个List<Long>而不是一个List<String>?显然,在调用方法的类型我只能提供List.class和祈祷.
//run and pray
List<Long> longNums = readProperty("prop", List.class);
Run Code Online (Sandbox Code Playgroud)
我已经想到这样一个方法错误地将一个String对象列表分配给一个长号列表,直到我运行它,我才看到了ClassCastException.
我的一个Java项目导出可执行部署的可执行"fat-JAR"文件.要使用Gradle创建JAR文件,我按照此处描述的说明操作:
task fatJar(type: Jar) {
manifest {
attributes 'Implementation-Title': '<HUMAN_READABLE_TITLE_OF_YOUR_PACKAGE>',
'Implementation-Version': version,
'Main-Class': '<PATH_TO_THE_MAIN_APPLICATION_CLASS>'
}
baseName = project.name + '-all'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}
Run Code Online (Sandbox Code Playgroud)
所示的任务将递归地通过依赖树,如果需要解压缩JAR,并将所有内容压缩在一起.到目前为止唯一的问题是我的一些依赖项带有自己的log4.properties文件,最终会覆盖我自己编写的文件.它们都位于相应的资源中folders,因此当文件合并在一起时,后面的文件似乎会覆盖之前添加的文件.
到目前为止,我找到的唯一解决方案是使用命令行参数手动设置正确文件的路径.我最终希望能够执行JAR本身,而无需额外的开销.
什么是保持我log4.properties和排除其他人被添加到包中的好方法?
有没有办法在每个阶段的框中显示某些环境变量和构建参数?这可能吗?
java ×4
spring ×4
hibernate ×3
javascript ×3
achievements ×1
backbone.js ×1
express ×1
generics ×1
gradle ×1
jar ×1
java-ee ×1
jenkins ×1
jms ×1
log4j ×1
lucene ×1
node.js ×1
php ×1
spring-boot ×1