任务调度EBSORACLE计划优化实践(ebs oracle计划)
任务调度:EBS ORACLE计划优化实践
在以企业资源计划(EBS)为代表的大型软件系统中,数据库作为其核心组成部分,在软件的正常运行和业务高效处理中有着至关重要的作用。而令人困扰的是,由于EBS中数据库的操作任务繁琐且复杂,因此企业在使用EBS时经常会遇到数据库性能瓶颈等问题。本文将围绕EBS ORACLE计划优化实践问题,提出解决问题的方法。
一、EBS ORACLE计划的概念
EBS ORACLE计划,简单来说是指在EBS环境中通过Oracle序列、定时任务等方式实现指定任务自动执行的一个机制。在EBS软件中,一些常规性的任务,比如检查用户会话、备份EBS系统等,这些工作都可以通过 EBS ORACLE计划进行自动执行。
二、EBS ORACLE计划的优化
在EBS使用中,为了保证系统的稳定和高效性,必须对EBS ORACLE计划进行优化。由于EBS系统中存在大量的数据库操作和计划任务,如果管理不当,可能会引起EBS突然卡死、任务超时等问题,给业务带来不小困扰。下面对于EBS ORACLE计划的优化问题提出以下建议:
(一)定期清理历史记录
在EBS系统中,随着时间的推移,计划任务的执行记录不断积累,若不及时清理,将会导致系统运行速度变慢,同时也占用大量磁盘空间。因此,建议定期清理历史记录,清理完毕后将会大大减轻数据库的负担,提高系统运行效率。请看下面Python代码实现:
“`python
#!/usr/bin/env python
# coding:utf-8
# python 清理ebs计划任务
import os
os.environ[‘NLS_LANG’] = ‘AMERICAN_AMERICA.AL32UTF8’
import cx_Oracle
import datetime
DB_HOST = ‘192.168.1.222’ # 数据库IP地址
DB_PORT = 1521 # 数据库端口
DB_SID = ‘ebs’ # 数据库实例名
DB_USER = ‘apps’ # 数据库用户名
DB_PWD = ‘password’ # 数据库密码
DB_CHARSET = ‘utf8’
# 表名:%_REQUEST_HISTORY
def clean_requests():
conn = cx_Oracle.connect(
‘{0}/{1}@{2}:{3}/{4}’.format(DB_USER, DB_PWD, DB_HOST, DB_PORT, DB_SID))
cursor = conn.cursor()
try:
nowtime = datetime.datetime.now()
starttime = (nowtime – datetime.timedelta(days=30)).date()
sql = “””delete %_request_history where request_date
cursor.execute(sql, startdate=starttime)
conn.commit()
except Exception as e:
conn.rollback()
rse e
finally:
cursor.close()
conn.close()
if __name__ == ‘__mn__’:
clean_requests()
此处为Python语言,利用cx_Oracle中的库和数据库连接就可以实现清理计划的历史记录。其余Python技术实现内容就不在此阐述。
(二)优化计划执行时间
在EBS系统中,任务链中的每一个任务都有其对应的计划时间,而这一计划时间对于业务节点完成时间的影响非常大。因此,在设计EBS ORACLE计划时,应注意将各个计划节点时间合理地分配,避免过多任务的同时执行,导致系统资源过度占用,从而影响业务处理的效率。
(三)避免重复执行
在EBS系统中,有些计划任务在短时间内触发了多次执行,如备份日志等,如果未妥善处理,这将极大增加EBS系统的运行负担,甚至极容易导致数据库死锁、卡死等故障。因此,针对这一问题,我们可以采用Python编程的方式,定时修改任务计划的执行时间,从而避免重复执行的问题。
下面是Python实现示例:
```python#!/usr/bin/env python
# coding:utf-8import os
os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.AL32UTF8'import cx_Oracle
import datetimeimport time
DB_USER = 'apps'DB_PWD = 'password'
DB_HOST = '192.168.1.222'DB_PORT = 1521
DB_SID = 'ebs'
interval = 5 # 自动执行时间间隔,单位:分钟
def get_app_si(fc, task_name): """
获取所需管理信息 :param fc: 数据库连接游标
:param task_name: 所调度任务名 :return: 调度信息列表
""" fc.prepare(r"SELECT application_name, deferred_to_date, request_id,"
r" request_date, request_time, real_start_date," r" real_start_time, actual_finish_date, actual_finish_time"
r" FROM fnd_conc_req_summary_v where concurrent_program_name=:name") fc.execute(None, {"name": task_name})
res = [] fetch = fc.fetchone()
if fetch: res = list(fetch)
return res
def delay_task(fc, task_name): """
延迟任务时间 :param fc: 数据库连接游标
:param task_name: 所调度任务名 """
res = get_app_si(fc=fc, task_name=task_name) if not res:
return end_time = datetime.datetime.combine(res[3], res[4])
delay_time = end_time + datetime.timedelta(minutes=interval) rq_id = res[2]
rq_start_date = delay_time.date().strftime("%Y-%m-%d") rq_start_time = delay_time.time().strftime("%H:%M:%S")
# 格式化修改SQL d_sql = "UPDATE FND_CONCURRENT_REQUESTS SET " \
"REQUESTED_START_DATE = TO_DATE('{sjrq}','YYYY-MM-DD'), " \ "REQUESTED_START_TIME = TO_DATE('{sjqj}','HH24:MI:SS')" \
"WHERE REQUEST_ID = {id}".format(sjrq=rq_start_date, sjqj=rq_start_time, id=rq_id) # 执行修改
fc.execute(d_sql) fc.connection.commit()
if __name__ == '__mn__': while True:
conn = cx_Oracle.connect('{0}/{1}@{2}:{3}/{4}'.format(DB_USER, DB_PWD, DB_HOST, DB_PORT, DB_SID)) cursor = conn.cursor()
delay_task(fc=cursor, task_name='XXDRZHJD - 外网自有数据库每日数据备份') cursor.close()
conn.close() time.sleep(2 * 60)
Python代码中,我们采用了cursor游标方式连接数据库,连通后根据所调度任务名,查询出任务的相关信息,通过Python的时间对象,将其当前执行时间进行延迟(在原有执行时间的基础上加上一定时长),最后再通过数据库SQL语言,将这一改变提交到EBS系统中,从而实现计划任务延迟执行。
三、总结
本文旨在通过EBS ORACLE计划优化实践的介绍,强调数据库在EBS系统中扮演至关重要的角色,对EBS计划任务进行了介绍,针对任务自动执行过程中的性能优化问题提出解决方法。其中,针对历史记录的清理、计划执行时间的优化、避免重复执行的问题,我们提出了实际可行的优化方案,可以有效减轻数据库运行负担,提高系统的运行效率。