构建基于Java的股票交易应用程序,需要指向要使用的技术

时间:2009-06-23 02:31:33

标签: java jquery jsp web-applications berkeley-db

我正在使用Java(带有jQuery前端)构建一个需要与第三方应用程序通信的应用程序。它需要每两秒更新一次界面。

使用彗星是个好主意吗?如果是这样,它们如何适应图片?

我可以使用哪些其他方法/技术来改善应用程序?

应用程序将从第三方应用程序轮询股票价格,将其写入数据库然后每秒将其推送到前端,对于轮询,我有一个每秒运行一次的计时器来调用第三方应用程序数据,然后我必须使用JSP或其他东西将它显示在前端,

在这一点上,我不确定是否应该使用servlet将其写入前端,你会推荐什么?我该怎么办呢?

我可以使用任何新技术代替servlet吗?

我也在使用Berkeley db存储数据,您认为它是一个不错的选择吗?如果使用伯克利,会有什么缺点..

我非常无能,所以任何建议都会非常感激。

谢谢!

编辑:我打算这样做,以便桌面应用程序不断从第三部分轮询并写入数据库,并且Web应用程序仅从数据库中读取和显示,这将减少Web应用程序上的负载和所有它必须做的是从db读取。

5 个答案:

答案 0 :(得分:5)

看看使用Web应用程序框架而不是Servlet - 除非它是一个真正基本的项目,只有一个屏幕。不幸的是,Java世界中有很多,它可能是一个雷区。坚持使用SpringMVC或Struts 2,最糟糕的部分就是设置它们,但是看看示例应用程序加上一两个教程并从那里开始工作。

http://www.springsource.org/about

http://struts.apache.org/2.x/index.html

另一个选择是使用Appfuse之类的模板框架来启动和运行,而无需将大量框架集成在一起,请参阅:

http://appfuse.org/display/APF/AppFuse+QuickStart

它为您提供了一个模板来设置SpringMVC,将MySQL作为数据库加上Spring作为POJO框架。这可能是一个快速入门和建立原型的方法。

根据你的2秒延迟要求来判断某种AJAX框架是明智的--JQuery或Prototype / Scriptaculous都是很好的起点。

http://jquery.com/

http://www.prototypejs.org/

在其他技术方面,为了让事情变得更好,你会想要考虑一个构建系统,Ant / Maven对Maven来说很好,两者稍微复杂一点。

http://ant.apache.org/

http://maven.apache.org/download.html

另外,考虑使用JUnit来测试应用程序。您可能希望将Selenium视为前端的功能测试。

http://www.junit.org

http://seleniumhq.org/

答案 1 :(得分:4)

这真的是一个股票交易应用程序吗?或者只是股票价格显示应用程序?我问,因为根据你的描述,它听起来像后者。

每秒对数据进行轮询的重要程度如何?特别是如果一些民意调查是迟到还是两秒钟呢?

如果您正在构建股票交易应用程序(时机非常关键),或者如果您无法在轮询时延迟,我建议您查看其中一个Java实时解决方案:< / p>

除此之外,我唯一的建议是坚持良好的OO设计实践。例如,使用DAO写入数据库,这样,如果您发现Berkeley DB不适合您,您可以相对轻松地切换到关系数据库系统。如果您确定需要,它还可以让您轻松转到某些数据库分区解决方案(例如Hibernate Shards)。

虽然我可能有自己的技术偏好(例如,我会像其他人提到的那样选择前端的Spring MVC,但我会尝试使用Hibernate来保持持久性),我真的不能说这些比其他技术更好。如果它符合要求,请选择您熟悉的东西。

答案 2 :(得分:2)

我认为在选择可扩展性和可扩展性的技术之前,您应该专注于您的架构设计。一旦建筑设计到位,您就可以看到可用的和可以构建的内容,所有这些都应该非常明显。

虽然不能直接比较Google,eBay和YouTube如何处理他们面临的可扩展性问题。虽然交易系统不会出现这些人与大量用户相关的问题,但您会遇到类似的数据量问题,并能够及时处理价格滴答。

伦敦证券交易所(LSE)有3000个名字,乘以全球10个左右的热门交易所,您可以在每个市场开放期间不断更新大量数据。为了让您了解从单个交易所捕获数据所涉及的内容,请查看http://kx.com/

从数据库的角度来看,你需要一些能够实现集群并具有可靠复制的工业实力 - 对我而言,这意味着Oracle。您还想看一下Time-series Database Design,根据我的经验,这是构建此类系统的最佳方式。

相同的扩展和可靠性要求将适用于您的应用服务器,JBoss是其中的合理选择,尽管我还考虑OSGi Spring Server(http://www.springsource.com/products/dmserver),因为它的轻量级特性可以使其更快。

您还希望Apache服务器能够实现负载平衡并提供静态内容 - 快速的Google会在此处显示大量信息,因此我不会在此重复。

也忘了投票,它不会缩放。查看为进程内通信使用消息传递和使用者进程进行跨进程通信,事件和工作线程。这两种技术都实现了自然的负载平衡效果,可以根据需要增加消费者进程或工作线程的数量来调整。

静态前端也不会削减芥末,恕我直言。看看市场上已有的东西--CNC Markets,IG Index等都有非常令人印象深刻的实时交易应用程序。

顺便说一下,假设这是一个商业项目,并不意味着整体上下降,像CNC Markets,IG Index等公司通过交易费赚钱,软件是达到目的的手段,只需拥有一个帐户即可免费访问。交易软件的另一个目标是商业机构,如银行,投资经理等。我想要一个非常严密的计划,以便在花费太多时间和精力之前打入这两个市场。

答案 3 :(得分:1)

PostgreSQL可能是正确的数据库。它比MySQL更有进取心。至于前端,有许多东西可以在servlet,SpringMVC,Tapestry等等“上面”。实际的servlet实现将对您隐藏。

许多人会建议,使用Spring配置应用程序并进行任何依赖注入可能并不是一个糟糕的建议。

如果您正在寻找更轻便的东西,您可能会考虑使用grails。它很快就会发展成熟并且变得成熟。

但实际上,如果不知道这会是什么样的“生产”环境,那就很难推荐。我们在谈论很多交易吗? (当然,这是一个股票交易程序,但它是一个模拟少数用户等...)建议事情很有趣,但如果你是认真的,我不确定我会开始一个像这个。有很多方法可以做到这一点,并且有很多方法可以做错。

答案 4 :(得分:0)

您的意图是建立一个显示实时数据的Web UI,例如:时间,市场数据等...

我个人使用的一种技术是Web Firm Framework,它是 Apache License 2.0 下的开源framework。它是用于构建Web UI的Java服务器端框架。对于每个标签和属性,都有一个对应的java类。我们只是使用Java代码而非纯HTML和JavaScript构建UI。这样做的好处是,我们对服务器标签和属性对象所做的任何更改都将反映到浏览器页面,而无需客户端的任何明确触发。对于您而言,我们可以简单地使用ScheduledExecutorService在UI中进行数据更改。

例如:

AtomicReference<BigDecimal> oneUSDToOneGBPRef = new AtomicReference<>(new BigDecimal("0.77"));

SharedTagContent<BigDecimal> amountInBaseCurrencyUSD = new SharedTagContent<>(BigDecimal.ZERO);

Div usdToGBPDataDiv = new Div(null).give(dv -> {

    //the second argument is formatter
    new Span(dv).subscribeTo(amountInBaseCurrencyUSD, content -> {
        BigDecimal amountInUSD = content.getContent();
        if (amountInUSD != null) {
            return new SharedTagContent.Content<>(amountInUSD.toPlainString(), false);
        }
        return new SharedTagContent.Content<>("-", false);
    });

    new Span(dv).give(spn -> {
        new NoTag(spn, " USD to GBP: ");
    });

    new Span(dv).subscribeTo(amountInBaseCurrencyUSD, content -> {

        BigDecimal amountInUSD = content.getContent();
        if (amountInUSD != null) {

            BigDecimal oneUSDToOneGBP = oneUSDToOneGBPRef.get();

            BigDecimal usdToGBP = amountInUSD.multiply(oneUSDToOneGBP);

            return new SharedTagContent.Content<>(usdToGBP.toPlainString(), false);
        }
        return new SharedTagContent.Content<>("-", false);
    });
});

amountInBaseCurrencyUSD.setContent(BigDecimal.ONE);

//just to test
// will print <div><span>1</span><span> USD to GBP: </span><span>0.77</span></div>
System.out.println(usdToGBPDataDiv.toHtmlString());


ScheduledExecutorService scheduledExecutorService =
        Executors.newScheduledThreadPool(1);

Runnable task = () -> {

    //dynamically get USD to GBP exchange value
    oneUSDToOneGBPRef.set(new BigDecimal("0.77"));

    //to update latest converted value
    amountInBaseCurrencyUSD.setContent(amountInBaseCurrencyUSD.getContent());
};
ScheduledFuture scheduledFuture = scheduledExecutorService.schedule(task, 1, TimeUnit.SECONDS);

//to cancel the realtime update
//scheduledFuture.cancel(false);

要实时显示时间,可以使用SharedTagContent<Date>ContentFormatter<Date>来显示特定时区的时间。您可以观看this video以获得更好的理解。您还可以从this github repository下载示例项目。